web-dev-qa-db-fra.com

Comment résoudre plusieurs conflits avec "git mergetool" sans avoir à fermer l'éditeur entre les fichiers?

J'ai trouvé git mergetool pour être un utilitaire pratique pour fusionner les différences visuellement, mais la façon dont je procède semble vraiment chancelante. Essentiellement, mon processus ressemble à ceci lorsque des conflits sont signalés:

  1. Exécutez un git mergetool
  2. À l'invite, appuyez sur Entrée pour lancer mon outil de comparaison (Meld ou FileMerge, selon l'ordinateur)
  3. Résoudre les conflits
  4. Enregistrez les modifications
  5. Fermez l'outil diff

Si j'ai plus d'un conflit, rincez, répétez. Oui, c'est moi qui ouvre et ferme mon visualiseur de diff une fois pour chaque conflit dans la fusion. Puisqu'il est lancé à partir de la ligne de commande, la fermeture est le seul moyen que je connaisse pour dire à git mergetool que j'ai résolu ce conflit particulier et qu'il peut passer au suivant.

Il y a sûrement une meilleure façon, mais je n'en ai aucune idée. Li'l aide, s'il te plait? Ce processus semble complètement inefficace.

53
Rob Wilkerson

À première vue, il ne semble pas possible de réutiliser une session d'outils de diff externe.

Le git-mergetool documentation indique clairement:

Si l'outil de fusion personnalisé indique correctement le succès d'une résolution de fusion avec son code de sortie, alors la variable de configuration mergetool.<tool>.trustExitCode peut être défini sur true.
Autrement, git-mergetool invitera l'utilisateur à indiquer le succès de la résolution après la sortie de l'outil personnalisé.

Ainsi, le code de sortie (ou la validation de l'utilisateur après la sortie de l'outil de diff) est nécessaire, ce qui implique que l'utilisateur ferme d'abord l'outil de diff externe.

Cela semble être une grande incitation à réduire le nombre de conflits à chaque tentative de fusion/rebase;) (quel que soit l'outil VCScs utilisé)

Remarque:
Deux autres paramètres des outils de diff externe git (" Configuration des outils de diff et de fusion pour Git sous Windows " et " Configurer SourceGear DiffMerge avec Git ") ne donnent pas plus d'espoir quand il s'agit de ne pas fermer l'outil de diff externe ...

34
VonC

Si votre mergetool de choix prend en charge l'ouverture de fichiers dans une instance existante, vous pouvez spécifier la commande dans votre configuration git:

% git config mergetool.whatever_you_want.cmd 'exec /path/to/merge/tool $LOCAL $MERGED $REMOTE'
% git config merge.tool whatever_you_want

git mergetool exécutera ensuite votre commande personnalisée, puis vous demandera si le fichier a été fusionné avec succès (au lieu de regarder un code de sortie).

Un exemple que je viens de pirater ensemble pour vimdiff:

% git config mergetool.persistent.cmd 'gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><C-W>l"'

Cela fonctionne assez bien, je peux commencer à l'utiliser moi-même!

22
Brian Phillips

Le problème pour mergetool est qu'il utilise délibérément une interface de ligne de commande pour lancer une session de fusion, puis attend que la commande invoquée revienne pour déterminer quand la fusion pilotée par l'utilisateur est terminée.

La plupart des outils de fusion ne fournissent pas de mécanisme de ligne de commande pour démarrer une session de fusion dans un processus déjà en cours avec un moyen de déterminer quand la résolution est terminée et si elle a réussi ou non.

Il est concevable que certains outils de fusion puissent fournir cette fonctionnalité via une commande wrapper séparée et une sorte d'IPC, mais ce serait extrêmement spécifique à l'outil et difficile à implémenter dans le programme générique mergetool.

12
CB Bailey