129 votes

Comment ajouter le nom de la branche de Git au message de livraison ?

J'ai besoin d'aide pour un script Bash script qui ajoutera automatiquement le nom de la branche de git en tant que hash dans les messages de commit.

5 votes

Pour tous ceux qui viennent ici, il semble que la meilleure réponse se trouve au bas de la page.

0 votes

Note complémentaire : tous les git branch | grep ... pour obtenir la branche courante ne sont pas la bonne façon de procéder. Considérez soit git symbolic-ref -q HEAD (comme indiqué dans cette réponse ) ou git rev-parse --abbrev-ref HEAD . La commande symbolic-ref échouera si vous êtes sur un HEAD détaché, donc si vous souhaitez détecter ce cas, utilisez-la. Sinon, la méthode rev-parse --abbrev-ref est probablement la meilleure.

199voto

shytikov Points 3048

Voici mon commit-msg script comme exemple :

#!/bin/sh
#
# Automatically adds branch name and branch description to every commit message.
#
NAME=$(git branch | grep '*' | sed 's/* //') 
DESCRIPTION=$(git config branch."$NAME".description)

echo "$NAME"': '$(cat "$1") > "$1"
if [ -n "$DESCRIPTION" ] 
then
   echo "" >> "$1"
   echo $DESCRIPTION >> "$1"
fi 

Crée le message de validation suivant :

[branch_name]: [original_message]

[branch_description]

J'utilise le numéro d'édition comme branch_name La description de l'émission est placée à l'adresse suivante branch_description en utilisant git branch --edit-description [branch_name] commandement.

Pour en savoir plus sur les descriptions de branches, consultez le site suivant Q&R .

L'exemple de code est stocké dans le document suivant Gist .

65voto

ninjagecko Points 25709

Utiliser le prepare-commit-msg o commit-msg githook .

Il y a déjà des exemples dans votre PROJECT/.git/hooks/ répertoire.

Par mesure de sécurité, vous devrez activer manuellement ce crochet sur chaque dépôt que vous souhaitez utiliser. Cependant, vous pouvez livrer le script et le copier sur tous les clones dans le fichier .git/hooks/ répertoire.

0 votes

Merci de m'avoir donné une bonne idée ; merci. Si vous pouvez m'aider davantage, avec le script lui-même, je vous en serai reconnaissant :)

5 votes

Je n'ai pas besoin de le faire, vous avez déjà un exemple qui le fait. exactement ce que vous voulez Comme je l'ai déjà dit, en .git/hooks/prepare-commit-msg.sample . =) Tout ce que vous avez à modifier (après avoir suivi les instructions dans les commentaires) est de copier-coller n'importe quelle solution de stackoverflow.com/questions/1593051/ vous aimeriez

5 votes

@ninjagecko, pour moi .git/hooks/prepare-commit-msg.sample contient trois exemples. L'un pour commenter une section de conflits, en ajoutant git diff --name-status -r et d'ajouter des lignes signées... Pas d'ajout du nom de la branche dans le message de validation. J'ai donc été obligé d'écrire mon propre hook.

43voto

Pylinux Points 605

Un script un peu plus simple qui ajoute le nom de la branche au message de validation. avant vous l'éditez. Ainsi, si vous souhaitez le modifier ou le supprimer, vous pouvez le faire.

Créer ce fichier .git/hooks/prepare-commit-msg :

#!/bin/bash

branchPath=$(git symbolic-ref -q HEAD) #Somthing like refs/heads/myBranchName
branchName=${branchPath##*/}      #Get text behind the last / of the branch path

firstLine=$(head -n1 $1)

if [ -z "$firstLine"  ] ;then #Check that this is not an amend by checking that the first line is empty
    sed -i "1s/^/$branchName: \n/" $1 #Insert branch name at the start of the commit message file
fi

6 votes

Je reçois : sed: 1: ".git/COMMIT_EDITMSG": invalid command code . lors de son utilisation.

1 votes

Aha, la différence avec Mac OSX, je vois : hintsforums.macworld.com/showpost.php?p=393450&postcount=11 pour la correction

2 votes

Comme la vérification du dossier de modification et de correction

31voto

Ferid Mövsümov Points 1903

Vous pouvez le faire en combinant les hooks prepare-commit-msg et pre-commit.

.git/hooks/prepare-commit-msg

#!/bin/sh

BRANCH=`git branch | grep '^\*' | cut -b3-`
FILE=`cat "$1"`
echo "$BRANCH $FILE" > "$1"

.git/hooks/pre-commit

#!/bin/bash

find vendor -name ".git*" -type d | while read i
do
        if [ -d "$i" ]; then
                DIR=`dirname $i`
                rm -fR $i
                git rm -r --cached $DIR > /dev/null 2>&1
                git add $DIR > /dev/null 2>&1
        fi
done

Définir les autorisations

sudo chmod 755 .git/hooks/prepare-commit-msg
sudo chmod 755 .git/hooks/pre-commit

1 votes

Notez que cela peut supprimer le message de validation original si vous utilisez la fonction --amend par exemple. Au lieu d'utiliser echo vous devez utiliser sed au lieu de cela. Le voici en une phrase : sed -i "1s@^@$(git branch | grep '^\*' | cut -b3-) @" $1

16voto

Tim Points 1

Ajouter le code ci-dessous dans le fichier prepare-commit-msg.

#!/bin/sh
#
# Automatically add branch name and branch description to every commit message except merge commit.
#

COMMIT_EDITMSG=$1

addBranchName() {
  NAME=$(git branch | grep '*' | sed 's/* //') 
  DESCRIPTION=$(git config branch."$NAME".description)
  echo "[$NAME]: $(cat $COMMIT_EDITMSG)" > $COMMIT_EDITMSG
  if [ -n "$DESCRIPTION" ] 
  then
     echo "" >> $COMMIT_EDITMSG
     echo $DESCRIPTION >> $COMMIT_EDITMSG
  fi 
}

MERGE=$(cat $COMMIT_EDITMSG|grep -i 'merge'|wc -l)

if [ $MERGE -eq 0 ] ; then
  addBranchName
fi

Il ajoutera le nom de la branche au message de validation, à l'exception de merge-commit. Le merge-commit contient par défaut des informations sur la branche le nom de la branche n'est donc pas nécessaire et rend le message moche.

2 votes

Cela ne modifiera donc pas le message de validation lorsqu'il trouvera le mot merge dans le message ?

3 votes

@thoroc, c'est techniquement correct ; cependant, dans une utilisation normale, ce n'est pas un gros problème. Le message de livraison analysé est le "message par défaut" avant que vous ne le modifiiez. Donc tant que votre modèle de commit ne contient pas le mot "merge", je pense que tout devrait bien se passer (tant que les autres messages "par défaut" ne le sont pas, à l'exception d'un message de commit de fusion par défaut). J'ai mal compris cela à l'origine, et je crois que j'ai bien compris maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X