web-dev-qa-db-fra.com

comment puis-je personnaliser le message de validation de la fusion de git?

Chaque fois que je fais une fusion, il me faut un commit de fusion et je voudrais qu'il ait plus que le résumé de tous les commits.

Ma question est comment puis-je formater git-fmt-merge-msg ou ce qui détermine ce message automatisé (Je peux le faire manuellement après une validation 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
62
shil88

Je voulais faire quelque chose comme ça. Je n'ai trouvé aucun moyen raisonnable d'obtenir que git fmt-merge-msg fonctionne. Je pense que cela ne fonctionne pas comme je l'espérais (transmettre un texte complètement personnalisé à utiliser pour le message). Alors, au lieu de cela, j’ai trouvé un autre moyen d’utiliser les commandes -no-commit et commit -F. La sortie est bien sûr personnalisable, mais elle reflète presque exactement ce que vous vouliez comme sortie.

Exemple de message de validation:

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 vais copier le pseudonyme ici:

[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" 

Si vous souhaitez le copier et le coller pour le personnaliser, utilisez ce qui précède. La version ci-dessous contient des sauts de ligne que vous ne voulez pas mais que j'utiliserai 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' $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"

Bien...

Ligne 1 démarre la fonction personnalisée en tant que script bash shell, ainsi git sait que ce n'est pas une commande git. Il définit la branche actuelle (maître si vous fusionnez une branche différente en maître) en une variable afin que nous puissions l'utiliser ultérieurement.
Line 2 affiche la première ligne en utilisant la branche actuelle et le nom de la branche que vous avez donné à la commande d'origine (comme vous le feriez dans une commande de fusion normale). Il écrit ceci dans un fichier temporaire.
Ligne 3 récupère le journal des validations de la branche entrante qui ne se trouvent pas dans la branche actuelle et écrit uniquement les objets de ces validations dans le fichier temporaire.
Line 4 imprime la ligne suivante sur temp.
La ligne 5 récupère le journal des validations de la branche actuelle qui ne se trouve pas dans la branche entrante et écrit uniquement les objets de ces validations dans le fichier temporaire.
La ligne 6 imprime un petit séparateur horizontal entre les parties résumé et détail.
Line 7 récupère le journal de tous les commits de la branche actuelle et de la branche entrante, juste après leur ramification, ou le dernier partage d'un ancêtre. La gauche-droite donne une flèche qui indique de quelle branche provient le commit. <signifie branche actuelle et> signifie branche entrante.
Line 8 exécute une commande de fusion avec la branche entrante sans avance rapide (donc vous obtenez un commit) et sans commit (vous devez donc en écrire une vous-même ... ah mais vous ne le faites pas !)
La ligne 9 exécute la commande commit avec les paramètres -e et -F pour permettre l'édition et indiquer à la validation de remplir le message avec le texte du fichier spécifié. Une fois que vous avez terminé le message de validation comme vous le souhaitez, il valide la fusion et supprime le fichier temporaire.

Tada! Les deux ; à la fin de cette longue commande permettent aux fonctions printf de ne pas écrire sur la console, mais uniquement sur le fichier. 

10
GaetaWoo

Je suis conscient que cela ne répond pas à la question initiale, mais pour le bénéfice des git noobs qui, comme moi, accèdent à cette page, car il s'agit actuellement du premier résultat de Google pour "git change merge commit message", je mentionnerai qu'il est possible à:

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

pour modifier le message de validation d'un commit de fusion sans perdre le lien avec l'un des parents du commit de fusion.

50
laszlok

On dirait que depuis la version Git 1.7.8 vous pouvez faire git merge --edit ...pour spécifier le message de validation. 

Et à partir de 1.7.10 , passer en mode édition sera le comportement par défaut

À partir de cette version, la commande "git merge" d'une session interactive lancera un éditeur lorsqu'elle résoudra automatiquement la fusion afin que l'utilisateur explique la validation résultante, tout comme la commande "git commit" message de validation.

(même si je ne le vois pas dans msysgit sous Windows).

17
R0MANARMY

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

note: n'utilisez pas les deux en même temps, car si la validation échoue, le journal sera ajouté à nouveau.

note personnelle: J'utilise la première solution car elle repose entièrement sur les hooks et les propriétés de configuration de git, au lieu d'un script externe.
Pour une solution réelle, il faudrait étendre une commande git nommée 'fmt-merge-msg' qui génère les descriptions oneline lors du passage de l'option --log (si vous avez vraiment besoin de cette solution, vous devrez créer votre propre patch (pour git) et le compiler à partir des sources). 

1. en utilisant prepare-commit-message comme VonC suggéré
cette solution a le problème que vous devez interrompre la validation, puis valider manuellement

définir un alias qui générera le message de validation souhaité:

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

créer le hook prepare-commit-msg en créant un exécutable prepare-commit-msg dans $ GIT_DIR/hooks/(exemple de script ci-dessous)

#!/bin/sh
#...

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

on devrait 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 l'alias lm créé dans 1.)

#!/bin/sh

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

puis exécutez une commande plutôt rigide:

./cmd-name <branch to merge>

si vous souhaitez toujours avoir la description en ligne des commits, vous aurez besoin d'ajouter de nouvelles commandes ou quoi que ce soit à l'argument -m (si vous utilisez --log, il sera généré en bas)

16
shil88

Une fois que vous avez fusionné votre <branch A> avec <branch B>, git validera automatiquement un message disant "fusionne <branch A> avec <branch B>.

Si vous souhaitez personnaliser le message de validation de la fusion de git, vous pouvez essayer:

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

Cette commande mettra à jour le message de validation de fusion de votre git en votre message de validation.

vous pouvez aussi essayer:

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

il va fusionner votre <branch B> avec <branch A>, avec la liste de <Branch B>'s commit et des messages de commit

Si cela échoue, 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 que vos commits sont déjà ajoutés à la scène, mais pas encore validés. Vous pouvez donc les commettre sans exécuter git add:

$ git commit -m "your merge commit message"

Si vous souhaitez modifier le dernier message de validation de <branch B>, vous pouvez à nouveau essayer: 

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

Mais, généralement, nous ne mettons pas à jour les autres messages de commit, à moins qu'ils ne soient incorrects.

Supposons que vous obtenez un conflit après la fusion de git, puis résolvez-le simplement et procédez comme suit: 

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

Il existe également une option --log pour git-merge maintenant, qui effectue la moitié de ce que vous voulez - elle place le shortlog (résumés de validation) dans le message de fusion. Une solution complète devra cependant utiliser un crochet, comme dans la réponse de VonC.

6
Cascabel

Vous pouvez essayer de définir un hook prepare-commit-msg } _ (le exemple 1 génère certains "messages de validation par défaut" personnalisés)

3
VonC

Arriver en retard à la fête, mais maintenant nous pouvons simplement utiliser
git merge --squash <branch>
fusionner une autre branche en une seule validation sur ma branche actuelle et pré-remplir notre message de validation avec tous les messages de validation fusionnés - ainsi que les messages détaillés, également, pas seulement les lignes uniques.
J'ai cherché des âges pour cette commande.

1

Une fonction bash très simple qui définit un message par défaut et ajoute votre argument .Elle ouvre votre éditeur avec le commutateur --edit si vous souhaitez apporter des modifications.

éditez ~/.bashrc ou bash_aliases. (N'oubliez pas de source ~/.bashrc) pour appliquer les modifications dans votre bashrc

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

utilisation:

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

maître <- développer: PR # 143 ...

0
nilsM