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.
Réponses
Trop de publicités?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
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
.
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.
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.
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...