Pergunta

Eu tenho dois repositórios, um é o principal repo para uma biblioteca, eo outro é um projeto usando essa biblioteca.

Se eu fizer uma correção para o no projeto subserviente, eu gostaria de uma maneira fácil de aplicar esse montante patch de volta.

A localização do arquivo é diferente em cada repositório.

  • Main repo: www.playdar.org/static/playdar.js
  • Project: playlick.com/lib/playdar.js

Eu tentei usar git format-patch -- lib/playdar.js no projeto playlick, e depois git am na principal repo playdar, mas os locais de arquivo diferentes no arquivo de patch levantou um erro.

Existe uma maneira fácil de aplicar o patch de um determinado comprometer em um determinado arquivo para outro arquivo arbitrário em outro lugar?

Para pontos de bônus, e se o arquivo que você deseja aplicar o patch não está em um repositório git?

Foi útil?

Solução

Se editar manualmente o arquivo de correção é fora de questão ou inviável, isso pode ser feito com as opções padrão (disponíveis em git apply, git format-patch e GNU patch).

  1. -p<n> remove n levando directórios dos caminhos do remendo.

  2. Após o processamento -p, --directory=<root> prepends root para cada um dos caminhos no patch antes de aplicar.

Exemplo

Assim, por seu exemplo, para tomar um patch que foi originalmente no static/playdar.js e aplicá-la a lib/playdar.js, você deve executar:

$ cat patch_file | git am     \ 
          -p1                 \ # remove 1 leading directory ('static/')
         --directory='lib/'     # prepend 'lib/'

Outras dicas

O patch produzido por git format-patch é simplesmente um texto file-- você pode editar os cabeçalhos diff para que ele modifica um caminho diferente.

Assim, por exemplo, teria produzido algo como isto:

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js

Tudo que você tem a fazer é mudança lib/playdar.js para static/playdar.js e, em seguida, executar o patch através git am"

O sistema transdérmico deve ser legível pelo utilitário remendo GNU padrão para as pessoas que não têm git --- mas não correm format-patch com o -M, -C etc. opções para manchas renomear produzir, nesse caso, porque o suporte para eles não é universal.

Assumindo que ambos os projectos são projectos git, parece que submódulos seria o ajuste perfeito para você. Isso permite que um link dinamicamente projeto git para outro projeto git, essencialmente assar um direito git repo dentro de outro repo git, ambos com suas próprias vidas distintas.

Em outras palavras, adicione "repo principal" como um sub-módulo no "projeto". Sempre que você cometer / empurrar coisas novas no "repo principal", você só git pull los de volta para "projeto".

Para completar Henrik do responder , e ir para o ponto de bônus

E se o arquivo que você deseja aplicar o patch não está em um repositório git?

Se você tem acesso aos diretórios do candidato arquivo para um patch vindo de um repositório git, você pode primeiro transformar essa árvore de diretórios / arquivos em si um repositório git! ( 'git init': um repositório git é apenas um .git dentro de um diretório raiz depois de tudo)
. Então você teria que definir que repo como um sub-módulo para seu projeto principal.

Você pode adicionar um novo controle remoto e puxar a partir dele. artigo com detalhes.

$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA

Eu penso subárvore é a melhor solução para o seu problema

Tutorial 1

Tuorial 2

Você pode simplesmente remover (renomear) temporariamente o repositório principal.

cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git

Usando a opção --relative para format-patch podem melhorar a captação (ocultar detalhes irrelevantes sobre o repositório a partir do qual o remendo foi gerado).

[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'

Eu encontrei a opção --3way a ser exigido ao aplicar o patch (a erro evitar does not exist in index) - sua milhagem pode variar. Usando --directory=(...) é provável que apenas necessário se o caminho de destino não é a raiz do repositório.

[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)

  • format-patch criará um arquivo de patch por se comprometer com o ramo atual desde 'base'.

  • A documentação para a opção --relative parece ser faltando em alguns casos , mas parece funcionar de qualquer maneira (a partir da versão 2.7.4).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top