2013-03-10 12 views
27

Come potrei forzare la visualizzazione della GUI di mergetool e disabilitare qualsiasi risoluzione automatica?Come posso forzare la visualizzazione della GUI di mergetool (kdiff3)?

A volte, quando c'è un conflitto durante un'unione e io uso il mergetool, semplicemente immediatelly ritorno dopo aver colpito entrare sulla questione "Hit ritorno per iniziare strumento di risoluzione merge (KDiff3)" e viene mostrata alcuna interfaccia grafica e il il conflitto sembra essere risolto.

Ho il git configurato per usare kdiff3 come mergetool ora, ma è successo anche quando ho codecompare come il mergetool specificato. So che esiste un'opzione "Salvataggio automatico ed esci dall'unione senza conflitti" in kdiff3, che potrebbe teoricamente causare il comportamento descritto, ma ho questa opzione disabilitata/deselezionata tutto il tempo.

Inoltre, c'è l'opzione trustExitCode direttamente in git mergetool gitconfig, che ho impostato su true, ma anche se l'ho impostata su false, la GUI non viene mostrata.

Non sono sicuro di chi sia l'auto che si risolve comunque. Mergetool in qualche pre-elaborazione o kdiff3?

Sono in esecuzione su Windows e ho installato le estensioni Git.

domanda Simillar specifico per KDiff3, è stato chiesto anche qui: Kdiff3 won't open with mergetool command

risposta

31

Git ha --auto hard coded opzione della riga di comando per KDiff3, che fa sì che la GUI di non farsi vedere se tutti i conflitti sono auto-risolvibile KDiff3 come. Nelle impostazioni di kdiff3 è possibile specificare le opzioni della riga di comando da ignorare, ma inserire --auto non ha funzionato per me.

Per aggirare il problema ho configurato la mia variante di kdiff3 come strumento di unione:

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

Questo è molto simile a quello che Git utilizza per impostazione predefinita per KDiff3, ma senza la bandiera --auto.

Ora è possibile chiamare git mergetool -t kdiff3NoAuto o configurare kdiff3NoAuto come mergetool globalmente e kdiff3 verrà sempre visualizzato quando si risolvono i conflitti.

Aggiornamento: per quanto riguarda la seconda parte della tua domanda, se si vuole veramente di disattivare qualsiasi risolvere automatica, basta aggiungere --qall alla riga kdiff3 comando precedente. Ma poi devi risolvere manualmente tutte le modifiche nel file manualmente, anche quelle che non hanno provocato un conflitto git. Lo scenario migliore sarebbe: kdiff3 mostra come git ha unito i file e lascia i conflitti aperti per l'utente da scegliere. Qualcuno sa come farlo?

+0

Wauu, è grandioso. Grazie! Potresti considerare di rispondere anche alla domanda collegata o inserire commenti di commento in quanto probabilmente è esattamente lo stesso problema alla fine. –

+0

Grazie. Ho collegato a questa risposta nell'altra domanda. – PiQuer

+1

L'aggiunta di "--auto" all'opzione della riga di comando ignorata ha funzionato per me con KDiff3 0.9.98 (64 bit). Menu Impostazioni -> Configura KDiff3 -> scheda Integrazione. Viene visualizzata la finestra di dialogo delle informazioni risolte automaticamente, ma viene visualizzata l'unione risultante, che consente ulteriori modifiche. –

0

Invece di configurare mergetool che viene chiamato solo quando c'è un conflitto, è sufficiente l'installazione di un driver fusione con kdiff:

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

Si può fare questo driver globale con l'aggiunta di --global. ma è necessario aggiungere un .gitattribute nel vostro repo:

* merge=kdiff 
0

Il comportamento di git mergetool dipende interamente lo strumento di fusione scelto e la riga di comando Git passa ad esso.Pertanto, per cambiare il suo comportamento, è necessario trovare una riga di comando che faccia ciò che si desidera e configurare Git per usare quella riga di comando.

Ho avuto questa domanda da solo (in particolare per quanto riguarda KDiff3), e PiQuer's answer mi ha fatto di parte del modo, ma mi ha fatto pensare. Ci dovrebbe essere un modo per replicare esattamente il comportamento predefinito di Git per KDiff3 eccetto senza l'opzione --auto (che è ciò che fa sì che KDiff3 non visualizzi la GUI).

Sembra che l'origine per il comando predefinito per lo strumento di unione kdiff3 sia nel file git/mergetools/kdiff3. Sembra uno script di shell, quindi dovremmo essere in grado di copiarlo esattamente! Mettendo su una sola riga, rimuovendo --auto, e fuggire le cose ci dà questa:

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" 

I base_present e merge_tool_path variabili non sono specificamente menzionati nella documentazione Git come disponibile da utilizzare in mergetool.<tool>.cmd, per cui è possibile ad un certo indicare in futuro che questo comando potrebbe non funzionare così com'è. Tuttavia, potrebbero essere facilmente sostituiti con un comando per verificare se BASE si riferisce a un file esistente e un percorso hard-coded per KDiff3, rispettivamente.

Si noti che il comando precedente sostituisce il comando predefinito per lo strumento di unione kdiff3 di Git anziché crearne uno separato.

Per quanto riguarda un paio di altri punti nel domanda iniziale:

  • L'impostazione trustExitCode dice Git se il codice di uscita del strumento di unione è una vera e propria indicazione di se la fusione ha avuto successo. Non influenzerà il comportamento dello strumento di unione ma piuttosto il comportamento di Git una volta uscito dallo strumento di unione. Vedi lo manual for git-mergetool.
  • La risoluzione automatica visualizzata dopo aver digitato git mergetool viene eseguita dallo strumento di unione stesso. git mergetool invoca semplicemente lo strumento esterno sulle versioni del file che devono essere unite.
Problemi correlati