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.
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.
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.
@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, 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.
patch
ne prend pas entièrement en charge ce format.Réponses:
et
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 patchfile
si 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
patch
commande (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,
patch
il n'est pas nécessaire d'utilisergit
pour pouvoir appliquer son diff en tant que patch.la source
git diff > patchfile
, maispatch -p1 < patchfile
relative
option comme:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
ne nécessite pas l'installation de git. La première commande illustre la commande de génération de diff, pas son application.git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
ougit diff from_branch to_branch > patchfile; ...
essaye ça:
la source
git diff
mettraa/
etb/
préfixes dans la sortie,patch -p1
néglige donc ceux d'appliquer le fichier de patch.Utilisation
si possible.
a un effet secondaire potentiel.
git apply
gère également les ajouts, les suppressions et les renommages de fichiers s'ils sont décrits dans legit diff
format, ce quipatch
ne fonctionnera pas. Enfin,git apply
est 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.la source
git apply
c'est la meilleure façon de le faire, mais cette question demande spécifiquement comment appliquer le correctif sans Git installé .--dry-run --verbose
sont utiles pour déterminer quels seront les effets secondaires, le cas échéant. (en utilisant le patch v2.5.8)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.j'utilise
De cette façon, les conflits peuvent être résolus comme d'habitude.
la source
Essaye ça:
la source