Wie lasse ich git das Mergetool automatisch öffnen, wenn es einen Merge-Konflikt gibt?

Lesezeit: 5 Minuten

Wie lasse ich git automatisch laufen git mergetool für einen Zusammenführungskonflikt? Dies sollte für alle Zusammenführungen gelten, die verwenden merge, rebase, pulletc.

  • Vielleicht kannst du eine verwenden Githookz.B post-checkout (Ich weiß nicht, ob es tatsächlich während einer Zusammenführung aufgerufen wird. post-merge erfordert eine erfolgreiche Zusammenführung)

    – Tobias Kienzler

    3. August 2012 um 8:35 Uhr

  • @TobiasKienzler Du könntest etwas dran sein. Wenn Sie eine funktionierende Lösung finden, gebe ich Ihnen das Kopfgeld für diese Frage.

    – Quinn Strahl

    14. Juli 2013 um 23:03 Uhr

  • @QuinnStrahl Ich glaube nicht, dass es derzeit einen Hook gibt, der vor jedem der verschiedenen Befehle ausgeführt wird, die zu einer Zusammenführung führen, daher ist der Wrapper von rospov wahrscheinlich die einfachste Lösung. Das oder das Ändern der Git-Quelle, um a pre-merge Hook-Funktionalität, in diesem Fall könnten Sie git natürlich einfach Mergetool bei Konflikten ausführen lassen, abhängig von einer Konfigurationseinstellung sowieso …

    – Tobias Kienzler

    15. Juli 2013 um 7:54 Uhr


  • Hm, okay. Danke für die Hilfe. Ich denke, ich werde einen Patch einreichen.

    – Quinn Strahl

    15. Juli 2013 um 13:17 Uhr

  • @QuinnStrahl Falls du inzwischen einen Patch eingereicht hast, würde ich mich über einen Link hier freuen 🙂

    – IARI

    12. Dezember 2016 um 19:57 Uhr

Benutzer-Avatar
Zwiebeljake

Du kannst git (noch) nicht dazu bringen.


Dies kann eine akzeptable Problemumgehung sein oder auch nicht.

Erstellen Sie eine Funktion in Ihrem ~/.bashrc:

git() 
{ 
  if [[ $1 == "merge" ]] || [[ $1 == "rebase" ]] || [[ $1 == "pull" ]]; then 
    command git "$@" 
    rc=$?
    if [[ $rc == 1 ]]; then
      echo "There are conflicts, better run git-mergetool!!!"
      # There might be some other condition that returns a '1',
      # if so you can add another check like this:
      # if grep Conflicts $(git --git-dir)/MERGE_MSG;
      command git mergetool
    fi
  else 
    command git "$@"
  fi
}

Mergetool wird beim Zusammenführen nicht aufgerufen:

$ git merge non_conflicting_branch
Merge made by the 'recursive' strategy.
 bar | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar

Mergetool wird aufgerufen, wenn es Konflikte gibt:

$ git merge conflicting_branch
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Automatic merge failed; fix conflicts and then commit the result.
There are Conflicts, better run git-mergetool!!!

Bei anderen Fehlern wird Mergetool nicht aufgerufen:

$ git merge adasds
fatal: adasds - not something we can merge

  • Dies führt nicht dazu, dass git automatisch das Mergetool öffnet, sondern die Shell dies tut.

    – Quinn Strahl

    17. Juli 2013 um 16:36 Uhr

  • Warum die Ablehnung? Dies ist im Wesentlichen eine sauberere Möglichkeit, die Antwort von rosipov zu implementieren.

    – Zwiebeljake

    17. Juli 2013 um 21:13 Uhr

  • Wie ist es sauberer? Ihnen fehlen einige Arten von Konflikten (wie z git stash pop). Da er nicht nach Befehl filtert, ist das kein Problem. Wie Sie selbst bemerken, wird der aktuelle Code gestartet git mergetool bei jedem Fehler mit 1 Status.

    – Matthäus Flaschen

    17. Juli 2013 um 22:35 Uhr

  • Ich kann nicht mit Sicherheit sagen, ob es andere Fehler mit einem Rückgabewert von 1 für die fraglichen Befehle gibt, da Git-Rückgabewerte im Allgemeinen nicht dokumentiert sind. Ich habe jedoch noch keinen gefunden, der kein Merge-Konflikt war.

    – Zwiebeljake

    24. Juli 2013 um 4:06 Uhr

  • @QuinnStrahl git kann es (noch) nicht, also ist es eine falsche Antwort, es durch die Shell zu erreichen?

    – Zwiebeljake

    24. Juli 2013 um 4:11 Uhr

Benutzer-Avatar
j13r

Sie können immer einen Alias ​​verwenden

alias 'git-merge'='git merge && git mergetool'
alias 'git-rebase'='git rebase && git mergetool'
alias 'git-pull'='git pull && git mergetool'

Und/oder schreiben Sie ein Hilfsskript in diese Richtung

#/bin/bash
git $*
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool

und dann

alias git="~/.git/git-script"

Es gibt keine direkte Möglichkeit zum Aufrufen von mergetool, da es nur eine von mehreren Möglichkeiten zum Zusammenführen ist (siehe „KONFLIKTE LÖSEN“ in Man1 git-merge).

  • Wie gesagt, ich möchte nur anrufen mergetool wenn es einen Konflikt gibt. Das Argument “nur eine von mehreren Möglichkeiten zum Zusammenführen” ist nicht überzeugend. Ja, es gibt mehrere Möglichkeiten, aber es ist durchaus vernünftig, eine als Standard auswählen zu wollen.

    – Matthäus Flaschen

    5. April 2012 um 17:51 Uhr


  • git mergetool wird nichts tun, wenn es keinen Konflikt gibt.

    – j13r

    5. April 2012 um 18:17 Uhr

Soweit ich weiß, gibt es dafür kein Porzellan.

Sie können einen Wrapper um Git wie diesen haben (file git_mergetool.shauf deinem Weg, +x):

#!/bin/bash

SEARCH="CONFLICT"
OUTPUT=$(git "$@" 2>&1 | tee /dev/tty)
if `echo ${OUTPUT} | grep -i "${SEARCH}" 1>/dev/null 2>&1`
then
  git mergetool
fi

Dann Alias ​​hinzufügen:

echo alias git=\"git_mergetool.sh\" >> ~/.bashrc

Jedes Mal, wenn Sie git aufrufen, prüft der Wrapper, ob das Wort „CONFLICT“ auftaucht. Wenn dies der Fall ist, startet der Wrapper das Mergetool.

Dies kann verbessert werden, indem eine genauere Phrase hinzugefügt wird $SEARCH (wie “Automatisches Zusammenführen fehlgeschlagen; Konflikte beheben und Ergebnis dann festschreiben.”) sowie durch Prüfen, ob das erste Argument ($1) befindet sich in der Liste der Befehle, die zu Zusammenführungskonflikten führen (pull, merge, etc…). Andernfalls werden Sie viele unnötige Daten analysieren, wenn die Ausgabe des Git-Befehls zu lang ist.

  • Ist es möglich, ohne Git effektiv zu aliasieren?

    – Quinn Strahl

    13. Juli 2013 um 11:56 Uhr

  • @QuinnStrahl Sie können das Skript benennen git (ohne Dateierweiterung) und fügen Sie Ihren Pfad vor der eigentlichen ausführbaren Git-Datei ein. Aber es ist so ziemlich nur eine andere Art des Aliasings. Also nein, ich kenne keinen Weg, dies ohne Aliasing von Git zu erreichen.

    – Ruslan Osipow

    13. Juli 2013 um 16:54 Uhr

  • Sollte einigermaßen praktikabel sein, aber die CONFLICT-Regex muss verbessert werden. Ich denke, es wird es derzeit überall aufnehmen, sogar in zB der Diff-Ausgabe. Zumindest kann man nach Zeilenposition filtern (z. B. Anker) und eventuell den Text erweitern.

    – Matthäus Flaschen

    17. Juli 2013 um 22:37 Uhr

1216360cookie-checkWie lasse ich git das Mergetool automatisch öffnen, wenn es einen Merge-Konflikt gibt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy