Comment pourrais-je forcer mergetool GUI (KDiff3) à être toujours affiché?

Comment pourrais-je forcer l'interface graphique de mergetool à être toujours affichée et désactiver toute résolution automatique?

parfois, lorsqu'il y a un conflit lors d'une fusion et que j'utilise mergetool, il retourne immédiatement après que j'ai appuyé sur entrez à la question "appuyez sur" return to start merge resolution tool (kdiff3) " et aucune interface graphique N'est affichée et le conflit semble résolu.

j'ai git configuré pour utiliser KDiff3 comme le mergetool maintenant, mais il est arrivé aussi quand j'ai codecompare comme le mergetool spécifié. Je sais qu'il y a une option "Auto save and quit on merge without conflicts" dans KDiff3, qui pourrait théoriquement causer le comportement décrit, mais j'ai cette option désactivée/non contrôlée tout le temps.

aussi, il y a l'option trustExitCode directement dans Git mergetool gitconfig, qui J'ai mis à true, mais même si je mets à false, L'interface graphique n'est pas montrée.

Je ne suis pas sûr qui fait l'auto-résolution de toute façon. Mergetool dans un prétraitement ou KDiff3?

je tourne sous Windows et je fais installer les extensions Git.

question similaire spécifique à KDiff3, a été posée ici aussi: Kdiff3 ne s'ouvrira pas avec la commande mergetool

27
demandé sur Peter Mortensen 2013-03-10 14:59:02

3 réponses

Git a --auto hard codé comme une option en ligne de commande de KDiff3, ce qui fait que L'interface graphique n'apparaît pas si tous les conflits sont auto-résolubles par KDiff3. Dans les paramètres de KDiff3, vous pouvez spécifier des options de ligne de commande à ignorer, mais mettre --auto n'a pas fonctionné pour moi.

comme solution de contournement, j'ai configuré ma propre variante de KDiff3 comme outil de fusion:

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"$MERGED (Base)\" --L2 \"$MERGED (Local)\" --L3 \"$MERGED (Remote)\" -o \"$MERGED\" \"$BASE\" \"$LOCAL\" \"$REMOTE\""

c'est très similaire à ce que Git utilise par défaut pour KDiff3, mais sans le drapeau --auto .

Maintenant vous pouvez appeler git mergetool -t kdiff3NoAuto ou configurer kdiff3NoAuto comme mergetool globalement et KDiff3 apparaîtra toujours lors de la résolution de conflits.

en ce qui concerne la deuxième partie de votre question, si vous voulez vraiment désactiver toute résolution automatique, il suffit d'ajouter --qall à la ligne de commande kdiff3 ci-dessus. Mais ensuite vous devez résoudre manuellement tous les changements dans le fichier manuellement, même ceux qui n'ont pas abouti à un Git conflict. Le meilleur scénario serait: KDiff3 montre comment Git fusionné les fichiers et laisse les conflits ouverts pour l'utilisateur de choisir.

31
répondu PiQuer 2018-07-20 23:17:01

le comportement de git mergetool dépend entièrement de l'outil de fusion choisi et de la ligne de commande Git passe à celui-ci. Par conséquent, pour changer son comportement, vous devez trouver une ligne de commande qui fait ce que vous voulez et configurer Git pour utiliser cette ligne de commande.

j'ai eu cette question moi-même (spécifiquement en ce qui concerne KDiff3), et réponse de PiQuer m'a obtenu une partie du chemin, mais il m'a fait réfléchir. Il devrait y avoir un moyen de répliquer Le comportement par défaut de Git exactement pour KDiff3 sauf sans l'option --auto (ce qui fait que KDiff3 n'affiche pas l'interface graphique).

il semble que la source de la commande par défaut pour l'outil de fusion KDiff3 se trouve dans le fichier git/mergetools/kdiff3 . Qui ressemble à un script shell, nous devrions donc être en mesure de copier exactement! Mettre ça sur une ligne, enlever --auto , et échapper aux choses nous donne ceci:

git config --global mergetool.kdiff3.cmd "if \"$base_present\"; then \"$merge_tool_path\" --L1 \"$MERGED (Base)\" --L2 \"$MERGED (Local)\" --L3 \"$MERGED (Remote)\" -o \"$MERGED\" \"$BASE\" \"$LOCAL\" \"$REMOTE\" >/dev/null 2>&1; else \"$merge_tool_path\" --L1 \"$MERGED (Local)\" --L2 \"$MERGED (Remote)\" -o \"$MERGED\" \"$LOCAL\" \"$REMOTE\" >/dev/null 2>&1; fi"

les variables base_present et merge_tool_path ne sont pas spécifiquement mentionnées dans la documentation de Git comme pouvant être utilisées dans mergetool.<tool>.cmd , de sorte qu'il est possible à un moment donné dans le futur que cette commande ne fonctionne pas telle quelle. Cependant, ils pourraient facilement être remplacés par une commande pour vérifier si BASE se réfère à un fichier qui existe, et un chemin codé en dur pour KDiff3, respectivement.

Notez que la commande ci-dessus remplace la commande par défaut pour L'outil de fusion kdiff3 de Git plutôt que d'en créer un séparé.

concernant quelques autres points de la question initiale:

  • le paramètre trustExitCode indique à Git si le code de sortie de l'outil merge est une bonne indication de la réussite de la fusion. Il ne sera pas affecter le comportement de l'outil de fusion, mais plutôt le comportement de Git une fois l'outil de fusion a quitté. Voir le manuel pour git-mergetool .
  • La résolution automatique que vous voyez après avoir tapé git mergetool est fait par l'outil de fusion lui-même. git mergetool invoque simplement l'outil externe sur les versions de fichier qui doivent être fusionnées.
1
répondu Joel Davies 2018-07-20 23:22:07

au lieu de configurer mergetool qui n'est appelé qu'en cas de conflit, configurez simplement un pilote de fusion avec KDiff3:

git config merge.kdiff.driver 'kdiff3  "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor"  -L2 "Working Copy" --L3 "Version from Other Branch"'

vous pouvez rendre ce pilote global en ajoutant --global . Mais vous devez ajouter un .gitattribute dans votre dépôt:

*  merge=kdiff
0
répondu sophana 2018-07-20 23:18:30