2009-02-25 15 views
50

Ich habe gefunden git mergetool zu einem handlichen Dienstprogramm zum Verschmelzen diffs visuell, aber die Art, wie ich darüber gehe, scheint wirklich wonky. Im Wesentlichen meinen Prozess sieht wie folgt aus, wenn Konflikte gemeldet werden:Mit "git mergetool" verschmelzen

  1. Führen Sie eine git mergetool
  2. an der Eingabeaufforderung getroffen Geben Sie meinem Diff-Tool zu starten (Meld oder FileMerge, je nachdem, welcher Computer)
  3. Lösung der Konflikte
  4. Speichern, um die Änderungen
  5. den diff-Tool
Schließen

Wenn ich mehr als einen Konflikt habe, spüle, wiederhole. Ja, ich öffne und schließe meinen Diff-Viewer einmal für jeden Konflikt in der Zusammenführung. Da es von der Befehlszeile aus gestartet wird, ist es die einzige Möglichkeit, die ich kenne, git mergetool mitzuteilen, dass ich diesen bestimmten Konflikt gelöst habe und dass er zum nächsten übergehen kann.

Sicherlich gibt es einen besseren Weg, aber ich habe keine Ahnung. Li'l helfen, bitte? Dieser Prozess scheint verrückt ineffizient zu sein.

+6

Sie können auch 'git mergetool -y' ausführen, um die Eingabeaufforderungen dazwischen zu überspringen. Möglicherweise müssen Sie das Mergtool noch schließen, aber Sie müssen nicht zum Terminal zurückkehren und für jede neue Zusammenführung die Return-Taste drücken. – moeffju

+1

Wenn Sie ein Git-Merge von einer Reihe von Dateien machen und das ist alles worüber Sie sich Sorgen machen müssen, müssen Sie sich keine Sorgen machen. – jwg

+0

@moeffju Dies ist die beste Antwort, um den Prozess der Zusammenführungskonflikte zu beschleunigen. – mqklin

Antwort

34

Auf den ersten Blick scheint es nicht möglich, eine externe Diff-Tool-Sitzung wiederzuverwenden.

Die git-mergetool documentation eindeutig fest:

Wenn das benutzerdefinierte Merge-Tool zeigt richtig, den Erfolg einer merge Auflösung mit Exit-Code, dann die Konfigurationsvariable mergetool.<tool>.trustExitCode kann auf true gesetzt werden.
Andernfalls wird git-mergetool den Benutzer auffordern, den Erfolg der Auflösung anzugeben, nachdem das benutzerdefinierte Tool beendet wurde.

So ist der Beendigungscode (oder die Validierung des Benutzers nach dem Ausgang des diff Werkzeugs) benötigt, was bedeutet, dass der Benutzer zuerst das externe diff Werkzeug schließen.

, dass ein großer Anreiz, scheint die Anzahl der Konflikte auf jeder Zusammenführung zu reduzieren/rebase man versucht;) (was auch immer das VCScs Werkzeug verwendet)

Hinweis:
Zwei weitere git externe diff-Tools-Einstellungen („Setting up diff and merge tools for Git on Windows“ und „Setting up SourceGear DiffMerge with Git“) geben nicht mehr Hoffnungen, wenn es kommt zu nicht Schließen des externen diff-Tool ...

+1

Wahr genug. :-) Danke für die Plausibilitätsprüfung. Was verwenden Sie und andere, um Zusammenführungen durchzuführen? Öffnen Sie einfach Dateien in Ihrem Editor Ihrer Wahl? –

+0

Ich benutze WinMerge unter Windows, aber ich muss es nach jeder Auflösung wie Sie schließen. – VonC

12

das Problem für mergetool ist, dass sie absichtlich eine Kommandozeilen-Schnittstelle verwendet eine Mergesitzung und dann wartet zu initiieren für den aufgerufenen Befehl zurückzukehren, um festzustellen, wann der Benutzer Die gesteuerte Zusammenführung wurde abgeschlossen. Die meisten Merge-Tools bieten keinen Befehlszeilenmechanismus zum Starten einer Zusammenführungssitzung in einem bereits ausgeführten Prozess, um festzustellen, wann die Auflösung abgeschlossen wurde und ob erfolgreich oder nicht.

Es ist denkbar, dass einige Merge-Tools diese Funktionalität durch einen separaten Wrapper-Befehl und eine Art von IPC bereitstellen können, aber im generischen Mergetool-Programm äußerst werkzeugspezifisch und schwierig zu implementieren wäre.

+1

Ich stimme dieser Analyse zu. +1 – VonC

+0

Git konnte den Status "Zusammenführungserfolg" basierend darauf ermitteln, ob das Zusammenführungsziel aktualisiert (geändert) wurde. Wenn ich dann die Zusammenführung speichere, bedeutet das, dass ich erfolgreich abgeschlossen habe. Sonst nicht. Aber für diesen Anwendungsfall wird möglicherweise eine zweistufige Zusammenführung benötigt. – phord

+0

@phord: Es tut dies für Werkzeuge, die keinen Status über ihre Rückgabewerte melden, aber das hilft in diesem Fall nicht, da es immer noch keinen Hinweis gibt, wenn es für git angemessen ist, den Status als Werkzeugsitzung zu überprüfen wurde bereits gestartet und kann nach Abschluss der Zusammenführung weiterarbeiten. –

22

Wenn Ihr mergetool der Wahl unterstützt Dateien in einer vorhandenen Instanz Öffnen Sie den Befehl in Ihrem git Config angeben:

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

git mergetool werden dann Ihre benutzerdefinierten Befehl ausführen und Sie dann auffordern, ob die Datei wurde erfolgreich zusammengeführt (anstelle eines Ausgangscodes).

Ein Beispiel, das ich gehackt zusammen nur für 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"' 

Das funktioniert gut genug, beginne ich kann es selbst mit!

+0

Interessant. Ich werde das mit WinMerge versuchen. +1 – VonC

+0

Ich muss zugeben, das ist ziemlich toll. Ich werde definitiv sehen müssen, was ich für Meld hacken kann. –

+0

Sieht so aus als gäbe es ein ausstehendes Patch- und Fehlerticket, um die Verwendung von meld auf diese Weise zu ermöglichen: http://bugzilla.gnome.org/show_bug.cgi?id=453670 –

Verwandte Themen