wake-up-neo.com

wie kann ich gits Merge-Commit-Nachricht anpassen?

Jedes Mal, wenn ich eine Fusion mache, brauche ich, dass eine Merge-Commit generiert wird, und ich möchte, dass es mehr als nur eine Zusammenfassung aller Commits gibt.

Meine Frage ist, wie kann ich git-fmt-merge-msg formatieren oder wie diese automatisierte Nachricht bestimmt wird (Ich kann dies nach einem Commit manuell tun, indem ich es korrigiere und git-log --pretty = format: '.. . ')

Zum Beispiel möchte ich es so formatieren:

 Merge branch 'test'  
    * test:  
      [BZ: #123] fifth commit subject  
      [BZ: #123] fourth commit subject  
      [BZ: #123] third commit subject  
      [BZ: #123] second commit subject  
      [BZ: #123] first commit subject  

 __________________________________________
 Merge details:  
     [BZ: #123] fifth commit subject  
               at 2010-06-30 11:29:00 +0100  
       - fifth commit body  

     [BZ: #123] fourth commit subject  
               at 2010-06-30 11:22:17 +0100  
       - fourth commit body  

     [BZ: #123] third commit subject  
               at 2010-06-30 11:21:43 +0100  
       - third commit body  

     [BZ: #123] second commit subject  
               at 2010-06-30 11:21:30 +0100  
       - second commit body  

     [BZ: #123] first commit subject  
               at 2010-06-30 11:29:57 +0100  
       - first commit body
62
shil88

Ich wollte etwas so machen. Ich habe keinen vernünftigen Weg gefunden, git fmt-merge-msg zur Arbeit zu bringen. Ich denke, es funktioniert nicht so, wie ich es mir erhofft hatte (gib einen vollständig benutzerdefinierten Text für die Nachricht ein). Stattdessen habe ich mit den Befehlen -no-commit und commit -F einen anderen Weg gefunden. Die Ausgabe ist natürlich anpassbar, spiegelt jedoch fast genau das wider, was Sie als Ausgabe 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 das oben. Die folgende Version enthält Zeilenumbrüche, die Sie nicht möchten, aber ich erkläre, was ich mache:

[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, sodass git weiß, dass es kein git-Befehl ist. Sie setzt den aktuellen Zweig (Master, wenn Sie einen anderen Zweig in Master zusammenführen) auf eine Variable, damit wir sie später verwenden können.
Zeile 2 druckt die erste Zeile mit dem aktuellen Zweig und dem Zweignamen, 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 erhält das Protokoll der Commits im eingehenden Zweig, die sich nicht im aktuellen Zweig befinden, und schreibt nur die Subjekte dieser Commits in die temporäre Datei.
Zeile 4 druckt die nächste Zeile mit Temp.
Zeile 5 erhält das Protokoll der Commits im aktuellen Zweig, die sich nicht im eingehenden Zweig befinden, und schreibt nur die Subjekte dieser Commits in die temporäre Datei.
Zeile 6 gibt ein kleines horizontales Trennzeichen zwischen den Zusammenfassungs- und Detailbereichen aus.
Zeile 7 ruft das Protokoll aller Commits in der aktuellen Verzweigung und in der eingehenden Verzweigung auf die Zeit zurück, kurz nachdem sie voneinander abgezweigt wurden oder zuletzt einen Vorfahren freigegeben hatten. Die linke und rechte Seite zeigt einen Pfeil, der angibt, aus welchem ​​Zweig der Commit stammt. <bedeutet aktueller Zweig und> bedeutet eingehender Zweig.
Zeile 8 führt einen Zusammenführungsbefehl mit dem ankommenden Zweig ohne Schnellvorlauf (damit erhalten Sie ein Commit) und ohne Commit aus (also müssen Sie selbst einen schreiben ... ach aber nicht !)
Zeile 9 führt den Commit-Befehl mit den Parametern -e und -F aus, um die Bearbeitung zu ermöglichen und dem Commit mitzuteilen, dass die Nachricht mit dem Text in der angegebenen Datei gefüllt wird. Nachdem Sie die Festschreibungsnachricht wie gewünscht beendet haben, wird die Zusammenführung festgelegt und die temporäre Datei gelöscht.

Tada! Die beiden ; am Ende dieses langen Befehls bewirken, dass die printf-Funktionen nicht in die Konsole geschrieben werden, sondern nur in die Datei. 

10
GaetaWoo

Ich bin mir dessen bewusst, dass dies nicht die ursprüngliche Frage beantwortet, aber für git noobs wie mich, der diese Seite erreicht, weil es das erste Google-Ergebnis für "git change merge commit message" ist, möchte ich erwähnen, dass dies möglich ist zu:

git commit --amend -m"New commit message"

Ändern der Commit-Nachricht eines Merge-Commit, ohne den Link zu einem der Eltern des Merge-Commits zu verlieren.

50
laszlok

Sieht aus wie ab Version Git 1.7.8 Sie können git merge --edit ... verwenden, um die Festschreibungsnachricht anzugeben. 

Ab 1.7.10 ist das Ablegen in den Bearbeitungsmodus das Standardverhalten

Ab dieser Version startet der Befehl "git merge" in einer interaktiven Sitzung einen Editor, wenn er die Zusammenführung für den Benutzer automatisch auflöst, um das resultierende Commit zu erklären, genau wie der "git commit" -Befehl, wenn er keine gegeben hat Nachricht übermitteln.

(obwohl ich es nicht in msysgit unter Windows sehe).

17
R0MANARMY

Ich habe herausgefunden, dass es zwei Möglichkeiten gibt, dieses Problem zu lösen

note: Verwenden Sie nicht beide gleichzeitig, da das Commit nicht zusammengeführt werden kann, wird das Protokoll wieder am Ende hinzugefügt.

persönliche Notiz: Ich verwende die erste Lösung, da sie vollständig auf gits Hooks und config-Eigenschaften basiert, anstatt auf ein externes Skript.
Für eine echte Lösung müsste der Befehl git mit dem Namen 'fmt-merge-msg' erweitert werden, der die Oneline-Beschreibungen generiert, wenn die Option --log übergeben wird (wenn Sie diese Lösung wirklich benötigen, müssen Sie eine eigene erstellen.) Patch (für Git) und kompilieren Sie es aus dem Quellcode). 

1. Verwenden der Prepare-Commit-Nachricht als VonC vorgeschlagen
Diese Lösung hat das Problem, dass Sie das Festschreiben unterbrechen und anschließend manuell festschreiben müssen

festlegen eines Alias, der die gewünschte Commit-Nachricht erstellt:

[alias]  
lm = log --pretty=format:'%s%n   by %C(yellow)%an%Creset (%ad)%n %n%b' --date=local

erstellen des Hooks Prepar-Commit-msg durch Erstellen einer ausführbaren Datei Prep-Commit-msg in $ GIT_DIR/hooks/(Beispielskript unten)

#!/bin/sh
#...

case "$2,$3" in  
  merge,)  
  echo "Merge details:" >> $1  
  echo "" >> $1  
  git lm ORIG_HEAD..MERGE_HEAD >> "$1" ;;  
*) ;;  
esac  

man sollte eine Alias-Commit-Nachricht definieren, wie zB

[alias]  
m = merge --no-ff --no-commit

2. einen benutzerdefinierten Befehl verwenden, der die Zusammenführung automatisch generiert
(unter Verwendung des in 1 erstellten lm-Alias)

#!/bin/sh

echo ""
echo "merge with commit details -- HEAD..$1"
git merge --no-ff --no-log -m "`git lm HEAD..$1`" --no-commit $1

und dann einen ziemlich starren Befehl ausführen:

./cmd-name <branch to merge>

wenn Sie immer noch die oneline-Beschreibung der Commits wünschen, müssen Sie dem -m-Argument neue Befehle hinzufügen oder sonst etwas (wenn Sie --log verwenden, werden sie unten generiert).

16
shil88

Sobald Sie Ihren <branch A> mit <branch B> zusammengeführt haben, schreibt git automatisch eine Nachricht mit der Aufschrift "Zusammenführen von Zweig <branch A>" in <branch B>.

Wenn Sie die Merit-Commit-Nachricht von git anpassen möchten, können Sie Folgendes versuchen:

$ git commit --amend -m "Your merge message"

Mit diesem Befehl wird die Merge-Commit-Nachricht Ihres Git auf Ihre Commit-Nachricht aktualisiert.

sie können auch versuchen:

$ git merge <branch A> --no-commit

ihr <branch B> wird mit <branch A> zusammen mit der Liste der <Branch B>'s-Commit- und Commit-Nachrichten zusammengeführt

Wenn der Schnellvorlauf fehlschlägt, wird Folgendes angezeigt: 

Automatic merge went well; stopped before committing as requested

# check this with git status 
$ git status

Es wird Ihnen zeigen, dass Ihre Commits bereits zur Bühne hinzugefügt wurden, aber noch nicht festgeschrieben sind. Sie können also Commit-Commits ausführen, ohne git add auszuführen:

$ git commit -m "your merge commit message"

Wenn Sie die letzte Commit-Nachricht von <branch B> ändern möchten, können Sie es erneut versuchen: 

$ git commit --amend -m "your new commit message"

Im Allgemeinen aktualisieren wir jedoch andere Commit-Nachrichten nicht, es sei denn, sie sind falsch.

Angenommen, Sie bekommen einen Konflikt nach dem Zusammenführen von Git, dann lösen Sie einfach Ihren Konflikt und tun Sie Folgendes: 

$ git add .
$ git commit -m "your commit message"
8
przbadu

Es gibt jetzt auch eine --log-Option für git-merge, die die Hälfte von dem macht, was Sie möchten - sie fügt das Shortlog (Commit-Zusammenfassungen) in der Zusammenführungsnachricht ein. Eine vollständige Lösung muss jedoch einen Haken wie in der Antwort von VonC verwenden.

6
Cascabel

Sie könnten versuchen, einen prepar-commit-msg -Hook zu definieren (das sample-one generiert einige benutzerdefinierte "Standard-Commit-Nachrichten")

3
VonC

Wir kommen zu spät zur Party, aber heutzutage können wir es einfach nutzen
git merge --squash <branch>
um einen anderen Zweig in einem einzigen Commit in meinem aktuellen Zweig zusammenzuführen und unsere Commit-Nachricht mit allen zusammengeführten Commit-Nachrichten vorab zu füllen - und auch die detaillierten Nachrichten, nicht nur die One-Liner.
Ich habe lange nach diesem Befehl gesucht.

1

Eine sehr einfache Bash-Funktion, die eine Standardnachricht einstellt und Ihr Argument hinzufügt. Sie öffnet Ihren Editor mit dem Schalter --edit, wenn Sie Änderungen vornehmen möchten.

bearbeiten Sie ~/.bashrc oder bash_aliases. (Vergessen Sie nicht source ~/.bashrc), um die Änderungen in Ihrer Bashrc anzuwenden

function mergedevelop()
{
    git merge --no-ff --edit -m "master <-- develop: $1" develop;
}

benutzen:

mergedevelop "PR #143..." Nachricht haben:

master <- Entwickeln: PR # 143 ...

0
nilsM