2013-03-10 10 views
27

Wie kann ich erzwingen, dass die mergetool-GUI immer angezeigt wird und die automatische Auflösung deaktiviert wird?Wie könnte ich mergeTool GUI (kdiff3) immer angezeigt werden?

Manchmal, wenn es ein Konflikt bei einer Zusammenführung ist, und ich verwende die mergetool, es ist einfach immediatelly zurückzukehren, nachdem ich auf Frage eingeben Hit „Hit Rückkehr merge Auflösung Tool zu starten (kdiff3)“ und keine GUI dargestellt und die der Konflikt scheint gelöst zu sein.

Ich habe die git konfiguriert, jetzt kdiff3 als mergetool zu verwenden, aber es ist auch passiert, wenn ich codecompare als mergetool angegeben haben. Ich weiß, dass es eine Option gibt "Auto speichern und beenden bei der Zusammenführung ohne Konflikte" in kdiff3, die theoretisch das beschriebene Verhalten verursachen könnte, aber ich habe diese Option deaktiviert/deaktiviert die ganze Zeit.

Es gibt auch trustExitCode Option direkt in Git mergetool gitconfig, die ich auf True festgelegt habe, aber selbst wenn ich es auf false setzen, wird die GUI nicht angezeigt.

Ich bin mir nicht sicher, wer die automatische Auflösung sowieso tut. Mergetool in einigen Vorverarbeitung oder kdiff3?

Ich laufe auf Windows und habe die Git-Erweiterungen installiert.

Simillar Frage spezifisch kdiff3, wurde auch hier gefragt: Kdiff3 won't open with mergetool command

Antwort

31

Git --auto hart codiert als Befehlszeilenoption muss kdiff3, die die gui verursacht nicht angezeigt, wenn alle Konflikte Auto-auflösbaren von kdiff3 sind. In den kdiff3-Einstellungen können Sie Befehlszeilenoptionen angeben, die ignoriert werden sollen, aber das Setzen von --auto dort funktionierte nicht für mich.

Als Abhilfe können konfiguriert ich meine eigene Variante von kdiff3 als Merge-Tool:

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

Diese sehr ähnlich ist standardmäßig für kdiff3 in welchem ​​git verwendet, aber ohne die --auto Flagge.

Jetzt können Sie git mergetool -t kdiff3NoAuto aufrufen oder kdiff3NoAuto als Mergetool global konfigurieren und kdiff3 wird immer angezeigt, wenn Konflikte aufgelöst werden.

Update: den zweiten Teil Ihrer Frage zu, ob Sie wirklich eine automatische Lösung, fügen Sie einfach --qall zum kdiff3 Befehlszeile oben deaktivieren möchten. Dann müssen Sie manuell alle Änderungen in der Datei manuell auflösen, auch diejenigen, die nicht zu einem Gitkonflikt führten. Das beste Szenario wäre: kdiff3 zeigt, wie git die Dateien zusammengeführt hat und die Konflikte für den Benutzer offen lassen. Weiß jemand, wie man das macht?

+0

Wauu, das ist großartig. Vielen Dank! Sie könnten in Betracht ziehen, die verknüpfte Frage auch zu beantworten oder einen Kommentarkommentar einzugeben, da es am Ende wahrscheinlich genau das gleiche Problem ist. –

+0

Danke. Mit dieser Antwort habe ich in der anderen Frage verknüpft. – PiQuer

+1

'--auto' zur ignorierten Befehlszeilenoption hinzuzufügen, funktionierte für mich mit KDiff3 0.9.98 (64bit). Einstellungsmenü -> KDiff3 konfigurieren -> Registerkarte Integration. Der Dialog für automatisch aufgelöste Informationen wird angezeigt, aber dann wird die resultierende Zusammenführung angezeigt, die eine weitere Bearbeitung ermöglicht. –

0

Statt mergetool der Konfiguration, die nur aufgerufen wird, wenn es einen Konflikt gibt, einfach Setup ein Merge-Treiber mit KDiff:

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

Sie können diese Treiber global machen durch Zugabe von --global. Aber Sie brauchen eine .gitattribute in Ihrem Repo hinzuzufügen:

* merge=kdiff 
0

Das Verhalten von git mergetool auf dem Merge-Tool ausgewählt völlig abhängig ist und die Befehlszeile Git an sie übergibt.Um sein Verhalten zu ändern, müssen Sie daher eine Befehlszeile finden, die das tut, was Sie wollen, und Git so konfigurieren, dass sie diese Befehlszeile verwendet.

Ich hatte diese Frage selbst (speziell in Bezug auf KDiff3), und PiQuer's answer bekam mich Teil des Weges, aber es brachte mich zum Nachdenken. Es sollte eine Möglichkeit geben, das Standardverhalten von Git exakt für KDiff3 zu replizieren, außer ohne die Option --auto (was dazu führt, dass KDiff3 die GUI nicht anzeigt).

Die Quelle für den Standardbefehl für das Tool kdiff3 merge scheint in der Datei git/mergetools/kdiff3. Das sieht nach Shell-Skript aus, also sollten wir es genau kopieren können! Putting, dass auf einer Linie, die Beseitigung --auto, und die Dinge zu entkommen gibt uns dies:

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" 

Die base_present und merge_tool_path Variablen sind nicht speziell in der Git-Dokumentation erwähnt als verfügbar in mergetool.<tool>.cmd zu verwenden, so dass es auf einige möglich ist Zeigen Sie in der Zukunft, dass dieser Befehl möglicherweise nicht so funktioniert, wie er ist. Sie könnten jedoch leicht durch einen Befehl ersetzt werden, um zu testen, ob sich BASE auf eine vorhandene Datei und einen fest codierten Pfad für KDiff3 bezieht.

Beachten Sie, dass der obige Befehl den Standardbefehl für das kdiff3 Merge-Tool von Git ersetzt, anstatt einen separaten Befehl zu erstellen.

In Bezug auf ein paar anderen Punkte in der ursprünglichen Frage:

  • Die trustExitCode Einstellung teilt Git, ob der Exit-Code des Merge-Tool eine richtige Anzeige ist, ob die Zusammenführung erfolgreich war. Dies hat keine Auswirkungen auf das Verhalten des Merge-Tools, sondern auf das Verhalten von Git, sobald das Merge-Tool beendet wurde. Siehe manual for git-mergetool.
  • Die automatische Auflösung, die Sie nach der Eingabe von git mergetool sehen, wird vom Merge-Tool selbst durchgeführt. git mergetool ruft lediglich das externe Tool für die Dateiversionen auf, die zusammengeführt werden müssen.
Verwandte Themen