Ich wollte so etwas einfach machen. Ich habe keinen vernünftigen Weg gefunden, um git fmt-merge-msg
zur Arbeit zu kommen. Ich denke, es funktioniert nicht so, wie ich es mir erhofft hatte (Übergabe eines vollständig benutzerdefinierten Textes für die Nachricht). Also habe ich stattdessen mit den Befehlen -no-commit
und einen anderen Weg gefunden commit -F
. Die Ausgabe ist natürlich anpassbar, spiegelt aber fast genau das wider, was Sie sich gewünscht haben.
Beispiel für eine Commit-Nachrichtenausgabe:
Merge branch fix4 into master
::SUMMARY::
Branch fix4 commits:
Add fix4b-4
Add fix4b-3
Add fix4b-2
Add fix4b-1
Branch master commits:
fix4b-5 on master
* * * * * * * * * * * * * * * * * * * * * * * * *
::DETAILS::
commit < 98ffa579e14610b3566e1a3f86556a04dc95a82b
Author: -----
Date: Fri Aug 17 17:23:26 2018 -0400
fix4b-5 on master
commit > 7e386dddee16a7c2588954d25dd6793cdaa1b562
Author: -----
Date: Fri Aug 17 15:18:17 2018 -0400
Add fix4b-4
use log output as commit message
commit 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date: Fri Aug 17 15:15:28 2018 -0400
Add fix4b-3
commit > 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date: Fri Aug 17 15:15:28 2018 -0400
Add fix4b-3
commit > c9bb199be49c17ca739d019d749263314f05fc46
Author: -----
Date: Fri Aug 17 15:15:27 2018 -0400
Add fix4b-2
commit > 5b622a935c9d078c7d0ef9e195bccf1f98cce5e4
Author: -----
Date: Fri Aug 17 15:15:27 2018 -0400
Add fix4b-1
Und die Verwendung wäre:
$ git mergelogmsg branch-name
Ich werde den Alias hier kopieren:
[alias]
mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg && git log --format=format:'%s' $var..$1 >> temp_merge_msg && printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && git log --format=format:'%s' $1..$var >> temp_merge_msg && printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && git log --left-right $var...$1 >> temp_merge_msg && git merge --no-ff --no-commit $1 && git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"
Wenn Sie es kopieren und einfügen möchten, um es anzupassen, verwenden Sie die oben genannten Schritte. Die folgende Version enthält Zeilenumbrüche, die Sie nicht möchten, aber ich werde verwenden, um zu erklären, was ich tue:
[alias]
1 mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) &&
2 printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg &&
3 git log --format=format:'%s' $var..$1 >> temp_merge_msg &&
4 printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg &&
5 git log --format=format:'%s' $1..$var >> temp_merge_msg &&
6 printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg &&
7 git log --left-right $var...$1 >> temp_merge_msg &&
8 git merge --no-ff --no-commit $1 &&
9 git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"
In Ordung...
Zeile 1 startet die benutzerdefinierte Funktion als Bash-Shell-Skript, damit git weiß, dass es sich nicht um einen git-Befehl handelt. Es setzt den aktuellen Zweig (Master, wenn Sie einen anderen Zweig in Master zusammenführen) auf eine Variable, damit wir ihn später verwenden können.
Zeile 2 druckt die erste Zeile unter Verwendung des aktuellen Zweigs und des Zweignamens, den Sie dem ursprünglichen Befehl gegeben haben (genau wie bei einem normalen Zusammenführungsbefehl). Es schreibt dies in eine temporäre Datei.
Zeile 3 ruft das Protokoll der Commits in der eingehenden Verzweigung ab, die sich nicht in der aktuellen Verzweigung befinden, und schreibt nur die Betreffs dieser Festschreibungen in die temporäre Datei.
Zeile 4 druckt die nächste Zeile nach Temp.
Zeile 5Ruft das Protokoll der Commits im aktuellen Zweig ab, die sich nicht im eingehenden Zweig befinden, und schreibt nur die Betreffs dieser Commits in die temporäre Datei.
Zeile 6 druckt ein kleines horizontales Trennzeichen zwischen dem Zusammenfassungs- und dem Detailteil.
Zeile 7 ruft das Protokoll aller Commits in der aktuellen Verzweigung und der eingehenden Verzweigung auf die Zeit zurück, kurz nachdem sie voneinander abgezweigt oder zuletzt einen Vorfahren geteilt haben. Links-rechts gibt einen Pfeil an, der anzeigt, aus welchem Zweig das Commit stammt. <bedeutet aktuelle Verzweigung und> bedeutet eingehende Verzweigung.
Zeile 8 führt einen Zusammenführungsbefehl mit dem eingehenden Zweig ohne Schnellvorlauf (damit Sie ein Commit erhalten) und ohne Commit (Sie müssen also selbst einen schreiben ... ah, aber Sie tun es nicht!) Aus.
Zeile 9 Führt den Commit-Befehl mit aus das -e
und-F
Parameter, die das Bearbeiten ermöglichen und dem Commit mitteilen, dass die Nachricht mit dem Text in der angegebenen Datei gefüllt werden soll. Sobald Sie die Festschreibungsnachricht wie gewünscht beendet haben, wird die Zusammenführung festgeschrieben und die temporäre Datei gelöscht.
Tada! Die beiden ;
am Ende dieses langen Befehls sorgen dafür, dass die printf-Funktionen nicht in die Konsole, sondern nur in die Datei geschrieben werden.