Como aplicar o patch `git diff` sem o Git instalado?

280

Como meu cliente pode aplicar o patch criado por git diffsem o git instalado? Eu tentei usar o patchcomando, mas ele sempre pede o nome do arquivo para corrigir.

Andrey Kuznetsov
fonte
4
Alguém sabe como fazer isso se o patch incluir renomear? O patch suporta isso nativamente agora?
Paul Crowley
3
A questão realmente deveria ser: existe uma maneira de aplicar um diff do git sem o git instalado? Conforme observado abaixo , patchnão suporta totalmente esse formato.
Aryeh Leib Taurog

Respostas:

425
git diff > patchfile

e

patch -p1 < patchfile

funciona, mas como muitas pessoas notaram nos comentários e em outras respostas, o patch não entende adiciona, exclui e renomeia. Não há opção, mas git apply patchfilese você precisar lidar com acréscimos, exclusões e renomeações de arquivos.


EDIT dezembro de 2015

As versões mais recentes do patchcomando (2.7, lançado em setembro de 2012) suportam a maioria dos recursos do formato "diff --git", incluindo renomeações e cópias, alterações de permissão e diferenças de vínculo simbólico (mas ainda não diferenças binárias) ( anúncio de versão ).

Portanto, desde que se use a versão atual / mais recente, patchnão há necessidade de usar gitpara poder aplicar seu diff como um patch.

Andrey Kuznetsov
fonte
97
Ou use git diff > patchfile, maspatch -p1 < patchfile
Jakub Narębski
11
Se você deseja criar um patchfile de um subcaminho do repositório, você pode usar a relativeopção como:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.
2
patch -p1 < patchfilenão requer o git instalado. O primeiro comando demonstra o comando para gerar diff, não aplicando-o.
precisa saber é o seguinte
1
O patch gerado é para as alterações da ramificação / refspec indicada no comando para a ramificação atual ou ativa. Em outras palavras, você quer git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileougit diff from_branch to_branch > patchfile; ...
hobs
1
@PaulChechetin Como o egor83 disse na resposta de suppie, retira uma barra no começo.
Andrey Kuznetsov
75

tente isto:

patch -p1 < patchfile
suppie
fonte
4
O que o argumento -p1 faz?
Chrisjlee #
8
Tiras de barra no começo. Veja man patch
egor83
16
O @chrisjlee git diffirá colocar a/e prefixar b/na saída, portanto, patch -p1negligencia aqueles que aplicam o arquivo de correção.
Wberry
49

Usar

git apply patchfile

se possível.

patch -p1 < patchfile 

tem potencial efeito colateral.

git applytambém lida com adição, exclusão e renomeação de arquivos, se descritos no git diffformato, o que patchnão funciona. Finalmente, git applyé um modelo "aplicar tudo ou abortar tudo", onde tudo é aplicado ou nada é, enquanto o patch pode aplicar parcialmente os arquivos de patch, deixando seu diretório de trabalho em um estado estranho.

Sola Yang
fonte
1
+1, a única resposta sã. Além disso, o diff / patch não manipula links simbólicos, o que é um problema se (por exemplo) você estiver revertendo o patch do kernel 3.10 do Linux.
Ignis #
10
Sim, git applyé a melhor maneira de fazer isso, mas essa pergunta pergunta especificamente como aplicar o patch sem o Git instalado .
Colin D Bennett
1
As opções --dry-run --verbosesão úteis para determinar quais serão os efeitos colaterais, se houver. (usando o patch v2.5.8) #
spyle
@ignis - " git apply patchfile -... a única resposta sã ..." - isso é quase risível. Toda vez que os desenvolvedores do OpenSSL me enviam um patch para testar, o Git falha em aplicá-lo. Isso é sempre . Ainda não vi a ferramenta idiota aplicar um patch.
JWW
8

eu uso

patch -p1 --merge < patchfile

Dessa forma, os conflitos podem ser resolvidos como de costume.

denis.peplin
fonte
-16

Tente o seguinte:

$ git apply file.diff
Shashi
fonte
29
Veja a pergunta: "sem o git instalado"
CB Bailey