Comment puis-je personnaliser le message de propagation de la fusion de git?

chaque fois que je fais une fusion, j'ai besoin d'un commit de fusion pour être généré et je voudrais qu'il ait plus que le résumé de toutes les commits.

ma question Est de savoir comment formater git-fmt-merge-msg ou ce qui détermine ce message automatisé (je peux le faire manuellement après une propagation en le modifiant et en utilisant git-log --pretty=format:'...')

par exemple, je voudrais le formater comme tel:

 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
57
demandé sur shil88 2010-06-30 15:42:30
la source

9 ответов

je voulais faire quelque chose comme ça. Je n'ai trouvé aucun moyen raisonnable de faire travailler git fmt-merge-msg . Je pense que cela ne fonctionne pas comme je l'espérais (passer dans un texte complètement personnalisé à utiliser pour le message). J'ai donc trouvé une autre façon d'utiliser les commandes -no-commit et commit -F . La sortie est bien sûr personnalisable, mais elle reflète presque exactement ce que tu voulais que la sortie de la.

Exemple De Message De Propagation:

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

et l'usage serait:

$ git mergelogmsg branch-name

Je copierai l'alias ici:

[alias]
    mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n'  $var  > temp_merge_msg && git log --format=format:'%s' $var.. >> temp_merge_msg && printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && git log --format=format:'%s' ..$var >> temp_merge_msg && printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && git log --left-right $var... >> temp_merge_msg && git merge --no-ff --no-commit  && git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f" 

si vous voulez le copier et le coller pour le personnaliser, utilisez ce qui précède. La version ci-dessous a des sauts de ligne que vous ne voulez pas mais je vais utiliser pour expliquer ce que je fais:

[alias]
1   mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && 
2        printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n'  $var  > temp_merge_msg && 
3        git log --format=format:'%s' $var.. >> temp_merge_msg && 
4        printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && 
5        git log --format=format:'%s' ..$var >> temp_merge_msg && 
6        printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && 
7        git log --left-right $var... >> temp_merge_msg && 
8        git merge --no-ff --no-commit  && 
9        git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"

D'accord...

ligne 1 démarre la fonction personnalisée comme un script shell bash git sait que ce n'est pas un ordre de git. Il définit la branche courante (master si vous fusionnez une branche différente en master) à une variable afin que nous puissions l'utiliser plus tard.

ligne 2 imprime la première ligne en utilisant la branche courante et le nom de la branche que vous avez donné à la commande originale (comme vous le feriez dans une commande de fusion normale). Il écrit ceci à un dossier temporaire.

ligne 3 obtient le log des commits dans le branche entrante qui ne sont pas dans la branche courante, et n'écrit que les sujets de ces commits dans le fichier temp.

Ligne 4 imprime la ligne suivante à la température.

ligne 5 obtient le journal des propagations dans la branche courante qui ne sont pas dans la branche entrante, et écrit seulement les sujets de ces propagations dans le fichier temp.

Ligne 6 imprime un petit séparateur horizontal entre le résumé et le détail.

ligne 7 obtient le journal de toutes les propagations dans la branche courante et la branche entrante à l'époque juste après qu'ils se sont ramifiés l'un de l'autre, ou dernier partagé un ancêtre. La flèche gauche-droite indique de quelle branche provient la propagation. < signifie branche courante et > signifie branche entrante.

ligne 8 executes une commande de fusion avec la branche entrante sans Avance rapide (donc vous obtenez une propagation) et sans propagation (donc vous devez en écrire une vous-même... ah mais tu ne le fais pas!)

Ligne 9 exécute la commande de propagation avec les paramètres -e et -F pour permettre l'édition et pour dire à la propagation de peupler le message avec le texte dans le fichier spécifié. Une fois que vous avez terminé le message de propagation comme désiré, il commet la fusion et supprime le les fichiers temp.

Tada! Les deux ; à la fin de cette longue commande font en sorte que les fonctions printf n'écrivent pas sur la console, mais seulement sur le fichier.

5
répondu GaetaWoo 2018-08-20 22:45:44
la source

je suis conscient que cela ne répond pas à la question originale, mais pour le bénéfice de git noobs comme moi qui atteignent cette page parce que c'est actuellement le premier résultat Google pour "Git change merge commit message", je vais mentionner qu'il est possible de:

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

pour modifier le message de propagation d'une propagation sans perdre le lien avec l'un des parents de la propagation.

44
répondu laszlok 2012-04-17 17:54:51
la source

ressemble à la version Git 1.7.8 vous pouvez faire git merge --edit ... pour spécifier le message de propagation.

et à partir de 1.7.10 , le passage en mode édition sera le comportement par défaut

à partir de cette version, la commande "git merge" dans une session interactive démarrera un éditeur lorsqu'elle résoud automatiquement la fusion pour que l'utilisateur puisse expliquer la propagation résultante, tout comme la commande "git commettre la commande" lorsqu'il n'a pas reçu un message de commit.

(même si Je ne le vois pas sur msysgit sous windows) .

17
répondu R0MANARMY 2012-11-13 04:38:46
la source

j'ai trouvé qu'il y a deux façons de résoudre ce problème

note : ne pas utiliser les deux en même temps, comme si le commit ne fusionnait pas, il ajoutera de nouveau le log au bas.

note personnelle : j'utilise la première solution car elle repose entièrement sur les crochets de git et les propriétés de configuration, au lieu d'un script externe.

Pour une solution réelle, il faudrait étendre une la commande git nommée 'fmt-merge-msg' génère les descriptions oneline en passant l'option --log (si vous avez vraiment besoin de cette solution, vous devrez créer votre propre patch (pour git) et le compiler à partir de la source).

1. en utilisant prepare-commit-message comme VonC suggéré

cette solution a le problème que vous devez interrompre la propagation puis la propagation manuellement

définir un alias qui construira le message de propagation désiré:

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

création du crochet prepare-commit-msg en créant un exécutable prepare-commit-msg dans $GIT_DIR/hooks/ (exemple de script ci-dessous)

#!/bin/sh
#...

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

il faut définir un alias commit msg tel que

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

2. en utilisant une commande personnalisée qui générera la fusion automatiquement

(en utilisant le lm alias créé en 1.)

#!/bin/sh

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

et ensuite exécuter une commande plutôt rigide:

./cmd-name <branch to merge>

si vous souhaitez toujours avoir la description oneline des commits, vous devrez ajouter de nouvelles commandes ou n'importe quoi à l'argument-m (si vous utilisez --log alors il sera généré en bas)

15
répondu shil88 2017-05-23 15:10:04
la source

une fois que vous fusionnerez votre <branch A> en <branch B> , git commettra automatiquement un message disant "merge branch <branch A> en <branch B> .

si vous voulez personnaliser le message de propagation de la fusion de git, vous pouvez essayer:

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

cette commande mettra à jour le message de commit de votre Git vers votre message de commit.

vous pouvez aussi essayer:

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

il va fusionner vos <branch B> avec <branch A> , avec une liste de <Branch B>'s s'engager et d'engager des messages

si elle ne fait pas fast-forward, alors vous obtiendrez quelque chose comme ceci:

Automatic merge went well; stopped before committing as requested

# check this with git status 
$ git status

il vous montrera, vos commits sont déjà ajoutés à la scène mais pas encore commentés donc, vous pouvez les commuter sans exécuter git add :

$ git commit -m "your merge commit message"

si vous voulez changer le dernier message de commit de <branch B> alors vous pouvez essayer:

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

mais, en général, nous ne mettons pas à jour les autres messages de propagation, à moins qu'ils ne soient incorrects.

Supposez, vous obtenez le conflit après la fusion git, puis tout simplement résoudre votre conflit et faire:

$ git add .
$ git commit -m "your commit message"
8
répondu przbadu 2014-01-24 18:11:56
la source

il y a aussi une option --log pour git-merge maintenant, qui fait la moitié de ce que vous voulez - elle place le shortlog (commit summaries) dans le message de fusion. Une solution complète devra cependant utiliser un crochet comme dans la réponse de VonC.

6
répondu Cascabel 2010-07-01 21:28:10
la source

vous pouvez essayer de définir un prepare-commit-msg hook (le sample one ne génère pas certains "messages de propagation par défaut")

3
répondu VonC 2015-04-16 03:06:14
la source

une fonction de bash très simple qui définit un message par défaut et ajoute votre argument. Il ouvre votre éditeur avec le commutateur --edit si vous voulez faire des changements.

éditer ~/.bashrc ou bash_aliases. (Ne pas oublier de source ~/.bashrc ) pour appliquer les changements dans votre bashrc

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

utiliser:

mergedevelop "PR #143..." pour avoir le message:

master <-- développer: PR #143...

0
répondu nilsM 2017-03-17 14:41:43
la source

arriver en retard à la fête, mais de nos jours, nous pouvons juste utiliser

git merge --squash <branch>

pour fusionner une autre branche en un seul commit sur ma branche actuelle et pré-peupler notre message de commit avec tous les messages de commit fusionnés -- et les messages détaillés, aussi, pas seulement les couches.

J'ai cherché pendant des siècles cette commande.

0
répondu Christian Severin 2018-05-14 17:50:33
la source

Autres questions sur git git-merge