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
, pull
etc.
Wie lasse ich git das Mergetool automatisch öffnen, wenn es einen Merge-Konflikt gibt?
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 gestartetgit 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
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.sh
auf 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
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