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.
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.
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.
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.
+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.
patch
não suporta totalmente esse formato.Respostas:
e
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 patchfile
se você precisar lidar com acréscimos, exclusões e renomeações de arquivos.EDIT dezembro de 2015
As versões mais recentes do
patch
comando (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,
patch
não há necessidade de usargit
para poder aplicar seu diff como um patch.fonte
git diff > patchfile
, maspatch -p1 < patchfile
relative
opção como:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
não requer o git instalado. O primeiro comando demonstra o comando para gerar diff, não aplicando-o.git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
ougit diff from_branch to_branch > patchfile; ...
tente isto:
fonte
git diff
irá colocara/
e prefixarb/
na saída, portanto,patch -p1
negligencia aqueles que aplicam o arquivo de correção.Usar
se possível.
tem potencial efeito colateral.
git apply
também lida com adição, exclusão e renomeação de arquivos, se descritos nogit diff
formato, o quepatch
nã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.fonte
git apply
é a melhor maneira de fazer isso, mas essa pergunta pergunta especificamente como aplicar o patch sem o Git instalado .--dry-run --verbose
são úteis para determinar quais serão os efeitos colaterais, se houver. (usando o patch v2.5.8) #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.eu uso
Dessa forma, os conflitos podem ser resolvidos como de costume.
fonte
Tente o seguinte:
fonte