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.


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.


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

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.


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.