130 votes

Comment appliquer un patch Git à un fichier ayant un nom et un chemin différents ?

J'ai deux dépôts. Dans l'un, j'apporte des modifications au fichier ./hello.test . Je commet les changements et crée un patch à partir de ce commit avec git format-patch -1 HEAD . Maintenant, j'ai un deuxième dépôt qui contient un fichier qui a le même contenu que hello.test mais qui est placé dans un répertoire différent sous un nom différent : ./blue/red/hi.test . Comment puis-je appliquer le correctif susmentionné à l'ordinateur de l'entreprise ? hi.test fichier ? J'ai essayé git am --directory='blue/red' < patch_file mais cela se plaint bien sûr que les fichiers ne sont pas nommés de la même façon (je pensais que Git ne s'en souciait pas ?). Je sais que je pourrais probablement modifier le diff pour qu'il s'applique à ce fichier spécifique, mais je cherche une solution par commande.

127voto

georgebrock Points 9582

Vous pouvez créer le patch en utilisant git diff puis de l'appliquer en utilisant le patch qui vous permet de spécifier le fichier auquel vous voulez appliquer la différence.

Par exemple :

cd first-repo
git diff HEAD^ -- hello.test > ~/patch_file

cd ../second-repo
patch -p1 blue/red/hi.test ~/patch_file

74voto

magiraud Points 829

Il existe une solution simple qui n'implique pas d'édition manuelle de patch ni de script externe.

Dans le premier dépôt (qui peut également exporter une gamme de dépôts, ajoutez l'attribut -1 si vous voulez sélectionner un seul commit) :

git format-patch --relative <committish> --stdout > ~/patch

Dans le deuxième dépôt :

git am --directory blue/red/ ~/patch

Au lieu d'utiliser --relative sur git format-patch une autre solution consiste à utiliser -p<n> option dans git am à dépouiller n à partir du chemin des correctifs, comme mentionné dans une réponse à une question similaire .

Il est également possible d'exécuter git format-patch --relative <committish> sans le --stdout et il générera un ensemble de .patch fichiers. Ces fichiers peuvent ensuite être introduits directement dans git am con git am --directory blue/red/ path/to/*.patch .

5voto

oliver Points 1153

En m'appuyant sur la réponse de @georgebrock, voici une solution que j'ai utilisée :

Tout d'abord, créez les fichiers patch comme d'habitude (ex. git format-patch commitA..commitB ).

Ensuite, assurez-vous que votre dépôt cible est propre (il ne doit pas y avoir de fichiers modifiés ou non suivis) et appliquez les correctifs comme ceci :

cd second-repo
git am ~/00*.patch

Pour chaque fichier patch, vous obtiendrez une erreur du type "error : XYZ n'existe pas dans l'index". Vous pouvez maintenant appliquer ce fichier patch manuellement :

patch --directory blue/red < ~/0001-*.patch
git add -a
git am --continue

Vous devez effectuer ces trois étapes pour chaque fichier patch.

Cela permettra de conserver le message de livraison d'origine, etc. sans nécessiter d'intervention particulière. git format-patch ou en modifiant les fichiers de correction.

2voto

LoveRight Points 909

Je comprends que les deux fichiers sont exactement les mêmes dans votre situation, donc le patch a des chances de réussir.

Cependant, dans le cas où vous voulez appliquer un patch à un fichier similaire, mais pas exactement le même, ou si vous voulez faire un Parcheando interactif, vous utiliserez la fusion à trois voies.

Disons que vous avez modifié le fichier A , désignons A~1 comme la version précédente, et vous voulez appliquer la différence entre A~1 a A vers le fichier B .

Ouvrez un outil de fusion à trois voies, par exemple Beyond Compare, le chemin du panneau de gauche est le suivant A Le panneau du milieu est l'ancêtre commun donc le chemin est A~1 la trajectoire du panneau de droite est B . Ensuite, le panneau inférieur montre le résultat de l'application de la différence entre A~1 a A vers le fichier B .

La figure suivante illustre cette idée.

enter image description here

0voto

Mike Robinson Points 3698

Pour info : j'ai récemment eu des problèmes en essayant de télécharger un correctif depuis Github et en l'appliquant à un fichier local (qui était un "remplacement" dans un nouvel emplacement).

git am ne voulait pas non plus appliquer le patch car le fichier n'était "pas dans l'index" ou "sale". Mais, j'ai découvert que la simple patch commande pourrait appliquer le patch. Il m'a demandé le nom du fichier à patcher.

J'ai fait le travail, en tout cas...

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