Crie um arquivo patch ou diff a partir do repositório git e aplique-o a outro repositório git diferente

155

Trabalho no projeto baseado em WordPress e quero corrigir meu projeto a cada nova versão do WP. Para isso, quero gerar um patch entre dois commits ou tags.

Por exemplo, no meu repo /www/WP, faço o seguinte:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Ou

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Meu projeto git baseado em WordPress

A git applylinha de comando não funciona, acho que porque estamos em repositórios diferentes.

Posso gerar um arquivo de correção sem confirmação, apenas um diferencial e aplicá-lo a outro repositório git?

Desde já agradeço.

zatamina
fonte

Respostas:

243

Você pode usar apenas git diffpara produzir um diff unificado adequado para git apply:

git diff tag1..tag2 > mypatch.patch

Você pode aplicar o patch resultante com:

git apply mypatch.patch
Enrico Campidoglio
fonte
1
Obrigado Enrico, eu usei $git diff -u tag1..tag2 > mypatch.patche $git apply --stat > mypatch.patcha resposta é 0 files changedoutra sugestão, por favor? :)
zatamine
Você precisa especificar o caminho para o arquivo de correção como argumento git apply. Eu atualizei minha resposta com um exemplo.
Enrico Campidoglio
1
Eu usei o git diff -p tag1 tag2 > my.patchque funcionou bem.
barclay
Como faço patches no formato diff unificado? sourceware.org/glibc/wiki/... diz Only unified diff (-uNr) format is acceptable., mas quando tento git diff -uNr tag1..tag2 > mypatch.patcheu recebo a mensagemusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke
2
Tenha cuidado git diff ...+ git apply ...não lide com arquivos excluídos / movidos corretamente ... quando git format-patch ...+ git am ...fizer.
vrince 8/01
50

Para produzir patch para várias confirmações, você deve usar o format-patchcomando git, por exemplo

git format-patch -k --stdout R1..R2

Isso exportará suas confirmações para o arquivo de correção no formato da caixa de correio.

Para gerar o patch para a última confirmação, execute:

git format-patch -k --stdout HEAD^

Em outro repositório, aplique o amcomando patch by git, por exemplo

git am -3 -k file.patch

Veja: man git-format-patche git-am.

kenorb
fonte
1
Que tal um patch que possa ser aplicado patch -p1? sourceware.org/glibc/wiki/…
Aaron Franke
Eu estava movendo patch do linux para winodws, tiveram de usar --ignore-espaço em branco como mencionado aqui stackoverflow.com/questions/13190679/...
Mahesh
2
@AaronFranke, você pode tentar a opção '-p': git format-patch -p HEAD ^ 1
Piroxiljin
É importante notar que isso tem a vantagem de manter as datas de confirmação, autor e confirmação das confirmações originais.
M. Justin
0

Como complemento, para produzir patch para apenas uma confirmação específica, use:

git format-patch -1 <sha>

Quando o arquivo de correção for gerado, verifique se o outro repo sabe onde está quando você usa git am ${patch-name}

Antes de adicionar o patch, use git apply --check ${patch-name}para garantir que não haja conflito.

Eugene
fonte