Comment appliquer le patch `git diff` sans que Git soit installé?


280

Comment mon client peut-il appliquer le correctif créé par git diffsans git installé? J'ai essayé d'utiliser la patchcommande mais elle demande toujours le nom du fichier à corriger.


4
Quelqu'un sait-il comment faire cela si le correctif comprend des renommages? Le correctif prend-il en charge nativement maintenant?
Paul Crowley

3
La question devrait vraiment être: existe-t-il un moyen d'appliquer un git diff sans que git soit installé? Comme indiqué ci - dessous , patchne prend pas entièrement en charge ce format.
Aryeh Leib Taurog

Réponses:


425
git diff > patchfile

et

patch -p1 < patchfile

fonctionne mais comme beaucoup de gens l'ont remarqué dans les commentaires et autres réponses, le patch ne comprend pas les ajouts, les suppressions et les renommages. Il n'y a pas d'option mais git apply patchfilesi vous avez besoin de gérer les ajouts, les suppressions et les renommages de fichiers.


EDIT décembre 2015

Les dernières versions de la patchcommande (2.7, publiées en septembre 2012) prennent en charge la plupart des fonctionnalités du format "diff --git", y compris les renommages et les copies, les modifications des autorisations et les différences de lien symbolique (mais pas encore les différences binaires) ( annonce de publication ).

Donc, à condition d'utiliser la version actuelle / la plus récente, patchil n'est pas nécessaire d'utiliser gitpour pouvoir appliquer son diff en tant que patch.


97
Ou utilisez git diff > patchfile, maispatch -p1 < patchfile
Jakub Narębski

11
Si vous souhaitez créer un fichier patch d'un sous-chemin du référentiel, vous pouvez utiliser l' relativeoption comme:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfilene nécessite pas l'installation de git. La première commande illustre la commande de génération de diff, pas son application.
Andrey Kuznetsov

1
Le patch généré est destiné aux changements de la branche / refspec indiquée dans la commande vers la branche actuelle ou active. En d'autres termes, vous voulez git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileougit diff from_branch to_branch > patchfile; ...
plaques de cuisson

1
@PaulChechetin Comme l'a dit egor83 dans la réponse de suppie, il supprime la barre oblique au début.
Andrey Kuznetsov

75

essaye ça:

patch -p1 < patchfile

4
Que fait l'argument -p1?
chrisjlee

8
Les bandes coupent au début. Voir patch homme
egor83

16
@chrisjlee git diffmettra a/et b/préfixes dans la sortie, patch -p1néglige donc ceux d'appliquer le fichier de patch.
wberry

49

Utilisation

git apply patchfile

si possible.

patch -p1 < patchfile 

a un effet secondaire potentiel.

git applygère également les ajouts, les suppressions et les renommages de fichiers s'ils sont décrits dans le git diffformat, ce qui patchne fonctionnera pas. Enfin, git applyest un modèle «appliquer tout ou abandonner tout» où tout est appliqué ou rien, alors que le correctif peut appliquer partiellement les fichiers de correctifs, laissant votre répertoire de travail dans un état étrange.


1
+1, La seule réponse sensée. De plus, diff / patch ne gère pas les liens symboliques, ce qui est un problème si (par exemple) vous rétablissez le correctif du noyau Linux 3.10.
ignis

10
Oui, git applyc'est la meilleure façon de le faire, mais cette question demande spécifiquement comment appliquer le correctif sans Git installé .
Colin D Bennett du

1
Les options --dry-run --verbosesont utiles pour déterminer quels seront les effets secondaires, le cas échéant. (en utilisant le patch v2.5.8)
spyle

@ignis - " git apply patchfile -... la seule réponse sensée ..." - c'est presque risible. Chaque fois que les développeurs OpenSSL m'envoient un patch à tester, Git ne l'applique pas. C'est à chaque fois. Je n'ai pas encore vu cet outil stupide appliquer un patch.
JWW

8

j'utilise

patch -p1 --merge < patchfile

De cette façon, les conflits peuvent être résolus comme d'habitude.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.