Come applicare la patch `git diff` senza Git installato?


280

Come può il mio client applicare la patch creata da git diffsenza git installato? Ho provato ad usare il patchcomando ma chiede sempre il nome del file da patchare.


4
Qualcuno sa come fare se la patch include rinominazioni? La patch lo supporta in modo nativo ora?
Paul Crowley,

3
La domanda dovrebbe davvero essere: c'è un modo per applicare un git diff senza git installato? Come indicato di seguito , patchnon supporta completamente questo formato.
Aryeh Leib Taurog,

Risposte:


425
git diff > patchfile

e

patch -p1 < patchfile

funziona ma come molte persone hanno notato nei commenti e in altre risposte la patch non comprende aggiunte, eliminazioni e rinominazioni. Non esiste alcuna opzione, ma git apply patchfilese è necessario gestire l'aggiunta, l'eliminazione e la ridenominazione dei file.


EDIT dicembre 2015

Le ultime versioni del patchcomando (2.7, rilasciate a settembre 2012) supportano la maggior parte delle funzionalità del formato "diff --git", inclusi i nomi e le copie, le modifiche alle autorizzazioni e le differenze di collegamento simbolico (ma non le differenze binarie) ( annuncio di rilascio ).

Quindi, a condizione che si usi la versione attuale / più recente, patchnon è necessario utilizzare gitper poter applicare il suo diff come patch.


97
Oppure usa git diff > patchfile, mapatch -p1 < patchfile
Jakub Narębski il

11
Se si desidera creare un file di patch di un sottopercorso del repository, è possibile utilizzare l' relativeopzione come:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfilenon richiede l'installazione di git. Il primo comando mostra il comando per generare diff, non applicarlo.
Andrey Kuznetsov,

1
La patch generata è per le modifiche dal ramo / refspec indicato nel comando al ramo corrente o attivo. In altre parole, vuoi git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileogit diff from_branch to_branch > patchfile; ...
piani cottura

1
@PaulChechetin Come ha detto egor83 nella risposta di suppie, all'inizio si taglia una barra.
Andrey Kuznetsov,

75

prova questo:

patch -p1 < patchfile

4
Cosa fa l'argomento -p1?
chrisjlee,

8
Le strisce vengono tagliate all'inizio. Vedi la patch man
egor83,

16
@chrisjlee git diffmetterà a/e b/prefissi in uscita, in modo patch -p1trascura quelli per applicare il file di patch.
wberry,

49

Uso

git apply patchfile

se possibile.

patch -p1 < patchfile 

ha un potenziale effetto collaterale.

git applygestisce anche l'aggiunta, l'eliminazione e la ridenominazione di file se sono descritti nel git diffformato, il che patchnon funziona. Infine, git applyè un modello "applica tutto o annulla tutto" in cui tutto è applicato o nulla è, mentre patch può applicare parzialmente i file patch, lasciando la directory di lavoro in uno stato strano.


1
+1, l'unica risposta sana. Inoltre, diff / patch non gestirà i symlink, il che è un problema se (per esempio) stai ripristinando la patch del kernel Linux 3.10.
ignis,

10
Sì, git applyè il modo migliore per farlo, ma questa domanda chiede specificamente come applicare la patch senza Git installato .
Colin D Bennett,

1
Le opzioni --dry-run --verbosesono utili per determinare quali saranno gli effetti collaterali, se presenti. (usando la patch v2.5.8)
spyle il

@ignis - " git apply patchfile -... l'unica risposta sana di mente ..." - è quasi ridicolo. Ogni volta che gli sviluppatori OpenSSL mi inviano una patch per il test, Git non riesce ad applicarla. Questo è ogni volta. Devo ancora vedere che quello stupido strumento applica una patch.
JWW

8

Io uso

patch -p1 --merge < patchfile

In questo modo, i conflitti possono essere risolti come al solito.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.