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.

Andrey Kuznetsov
la source
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.

Andrey Kuznetsov
la source
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
suppie
la source
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.

Sola Yang
la source
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.

denis.peplin
la source
-16

Essaye ça:

$ git apply file.diff
Shashi
la source
29
Voir la question: "sans git installé"
CB Bailey