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

J’ai deux référentiels. En un, je modifie le fichier ./hello.test . Je commets les modifications et crée un patch à partir de ce commit avec git format-patch -1 HEAD . Maintenant, j’ai un deuxième référentiel 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 autre nom: ./blue/red/hi.test . Comment puis-je appliquer le correctif susmentionné au fichier hi.test ? J’ai essayé git am --directory='blue/red' < patch_file mais je git am --directory='blue/red' < patch_file bien sûr de ce que les fichiers ne sont pas nommés de la même façon (ce que Git ne pensait pas faire?). Je sais que je pourrais probablement modifier le diff pour l’appliquer à ce fichier spécifique, mais je recherche une solution de commande.

Vous pouvez créer le correctif à l’aide de git diff , puis l’appliquer à l’aide de l’utilitaire de patch , qui vous permet de spécifier le fichier auquel vous souhaitez appliquer le diff.

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 l’édition manuelle de correctifs ni de script externe.

Dans le premier référentiel (cela peut également exporter une plage de commit, utilisez -1 si vous ne souhaitez sélectionner qu’un seul commit):

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

Dans le second référentiel:

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

Au lieu d’utiliser --relative dans git format-patch , une autre solution consiste à utiliser l’option -p dans git am pour supprimer n répertoires du chemin des correctifs, comme indiqué dans une réponse à une question similaire .

Il est également possible d’exécuter git format-patch --relative sans le --stdout , et cela générera un ensemble de fichiers .patch . Ces fichiers peuvent ensuite être directement transmis à git am avec git am --directory blue/red/ path/to/*.patch .

Répondre à ma propre question avec un script qui fait exactement ceci: https://github.com/mprpic/apply-patch-to-file

Plutôt que de modifier le fichier de correctif manuellement, il demande à l’utilisateur le fichier cible, modifie le correctif et l’applique au référentiel dans lequel vous vous trouvez.

Je comprends que les deux fichiers sont exactement les mêmes dans votre situation, donc le correctif est susceptible de réussir.

Toutefois, si vous souhaitez appliquer un correctif à un fichier similaire, mais pas exactement le même, ou si vous souhaitez effectuer une correction interactive, vous utiliserez la fusion à trois voies.

Disons que vous avez modifié le fichier A , notons A~1 comme la version précédente, et que vous souhaitez appliquer le diff entre A~1 et A au fichier B

Ouvrez un outil de fusion à trois voies, par exemple Beyond Compare, le chemin du panneau de gauche est A , le panneau du milieu est l’ancêtre commun, donc le chemin est A~1 , le chemin du panneau de droite est B Ensuite, le panneau inférieur affiche le résultat de l’application du diff entre A~1 et A au fichier B

La figure suivante illustre l’idée.

entrer la description de l'image ici