197 votes

Puis-je obtenir une sortie compatible avec le patch à partir de git-diff ?

Je fais mal quelque chose de très simple. J'essaie de préparer un fichier patch ordinaire, afin de pouvoir réappliquer certaines modifications :

$ git diff > before
$ git diff something_here > save.patch
$ git checkout . 
$ patch < save.patch
$ git diff > after
$ diff before after
$

Avec something_here vierge ça marche presque, mais les noms de fichiers ne sont pas corrects. Je pense qu'il me manque juste une option.

Dans la vie réelle, je vais faire une fusion après le checkout, donc le patch pourrait échouer à ce moment-là, mais vous voyez où je veux en venir.

Modifier C'est ma faute, j'ai posé la mauvaise question. La vraie question est la suivante : je veux sauvegarder mes modifications, faire une fusion, puis réappliquer les modifications, si possible ? Je l'ai posée de la mauvaise façon parce que je suis utilisé d'utiliser le patch pour résoudre ce genre de problèmes et git diff on dirait que c'est ce qu'il voulait que je fasse.

Charles Bailey's commentaire avait la bonne réponse. Pour moi, git-apply est la bonne chose à faire (git-stash semble plus lourd que ce dont j'ai besoin et le rebasement et les bundles sont définitivement au-delà de mon niveau de compétence actuel). Je vais accepter la réponse donnée par Charles (parce que vous ne pouvez pas accepter un commentaire). Merci pour toutes les suggestions.

258voto

ndim Points 11557

Il suffit d'utiliser -p1 : vous devrez utiliser -p0 dans le --no-prefix de toute façon, donc vous pouvez simplement laisser de côté l'élément --no-prefix et utiliser -p1 :

$ git diff > save.patch
$ patch -p1 < save.patch

$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch

156voto

Charles Bailey Points 244082

Si vous souhaitez utiliser le patch, vous devez supprimer l'option a/ b/ préfixes que git utilise par défaut. Vous pouvez le faire avec l'option --no-prefix (vous pouvez également faire cela avec l'option de patch -p option) :

git diff --no-prefix [<other git-diff arguments>]

En général, cependant, il est plus facile d'utiliser le droit git diff et ensuite utiliser la sortie pour alimenter git apply .

La plupart du temps, j'essaie d'éviter d'utiliser des correctifs textuels. Habituellement, un ou plusieurs commits temporaires combinés à un rebasement, git stash et les paquets sont plus faciles à gérer.

Pour votre cas d'utilisation, je pense que stash est le plus approprié.

# save uncommitted changes
git stash

# do a merge or some other operation
git merge some-branch

# re-apply changes, removing stash if successful
# (you may be asked to resolve conflicts).
git stash pop

16voto

Henrik Gustafsson Points 11755

Les diffs git ont un segment de chemin supplémentaire ajouté aux chemins des fichiers. Vous pouvez supprimer cette entrée dans le chemin en spécifiant -p1 avec patch, comme ceci :

patch -p1 < save.patch

12voto

matejkramny Points 1853
  1. Je sauvegarde la différence du répertoire actuel (y compris les fichiers non validés) par rapport au HEAD actuel.
  2. Ensuite, vous pouvez transporter le save.patch vers où que ce soit (y compris les fichiers binaires).
  3. Sur votre machine cible, appliquez le patch en utilisant git apply <file>

Note : il diffère aussi les fichiers en cours d'indexation.

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch

8voto

slowstart Points 70

Une astuce utile pour éviter de créer des fichiers temporaires de patch :

git diff | patch -p1 -d [dst-dir]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X