web-dev-qa-db-fra.com

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

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

90
Tomer Lichtash

Utilisez le prepare-commit-msg ou commit-msggithook .

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

Par mesure de sécurité, vous devrez activer manuellement un tel hook sur chaque référentiel que vous souhaitez utiliser. Cependant, vous pouvez valider le script et le copier sur tous les clones dans le .git/hooks/ répertoire.

47
ninjagecko

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 de problème comme branch_name, la description du problème est placée dans le branch_description en utilisant git branch --edit-description [branch_name] commande.

Pour en savoir plus sur les descriptions de succursales, consultez cette Q&A .

L'exemple de code est stocké dans --- Gist .

167
shytikov

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

Créez 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
28
Pylinux

Vous pouvez le faire avec une combinaison des 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
25
Farid Movsumov

ajoutez 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, sauf la fusion-validation. Le merge-commit a des informations de branche par défaut donc un nom de branche supplémentaire n'est pas nécessaire et rend le message laid.

9
Tim

Inspiré par la réponse de Tim qui s'appuie sur la réponse du haut, il s'avère que le hook prepare-commit-msg prend comme --- argument sur le type de commit qui se produit . Comme on le voit dans le msg par défaut prepare-commit-msg si $ 2 est 'merge' alors c'est un commit de fusion. Ainsi, le commutateur de casse peut être modifié pour inclure la fonction addBranchName () de Tim.

J'ai inclus ma propre préférence pour la façon d'ajouter le nom de la branche et toutes les parties non commentées de la valeur par défaut prepare-commit-msg.sample crochet.

prepare-commit-msg

#!/bin/sh

addMyBranchName() {
  # Get name of current branch
  NAME=$(git branch | grep '*' | sed 's/* //')

  # First blank line is title, second is break for body, third is start of body
  BODY=`cut -d \| -f 6 $1 | grep -v -E .\+ -n | cut -d ':' -f1 | sed '3q;d'`

  # Put in string "(branch_name/): " at start of commit message body.
  # For templates with commit bodies
  if test ! -z $BODY; then
    awk 'NR=='$BODY'{$0="\('$NAME'/\): "}1;' $1 > tmp_msg && mv tmp_msg "$1"
  else
    echo "title\n\n($NAME/):\n`cat $1`\n" > "$1"
  fi
}

# You might need to consider squashes
case "$2,$3" in
  # Commits that already have a message
  commit,?*)
  ;;

  # Messages are one line messages you decide how to handle
  message,)
  ;;

  # Merge commits
  merge,)
    # Comments out the "Conflicts:" part of a merge commit.
    Perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1"
  ;;

  # Non-merges with no prior messages
  *)
    addMyBranchName $1
  ;;
esac
4
Novice C

Si vous souhaitez le rendre global (pour tous les projets):

Créer git-msg fichier avec le contenu de réponse de shytikov , et le mettre dans un dossier:

mkdir -p ~/.git_hooks
# make it executable
chmod a+x ~/.git_hooks/commit-msg

Activez maintenant les hooks:

git config --global init.templatedir '~/.git_hooks'

et git init à nouveau dans chaque projet que vous souhaitez utiliser.

3
Maroun

J'avais des problèmes pour faire fonctionner ces solutions sur MacOS car il utilise BSD sed au lieu de GNU sed. J'ai réussi à créer un simple script qui fait le travail cependant. Toujours en utilisant .git/hooks/pre-commit:

#!/bin/sh
BRANCH=$(cat .git/HEAD  | cut -d '_' -f2)
if [ ! -z "$BRANCH" ]
then
    echo "$BRANCH" > "/Users/username/.gitmessage" 
else
    echo "[JIRA NUMBER]" > "/Users/username/.gitmessage"
fi 

Cela suppose une norme de dénomination de branche similaire à functional-desc_JIRA-NUMBER. Si le nom de votre agence est uniquement votre numéro de ticket Jira, vous pouvez simplement vous débarrasser de tout, de la pipe au f2. Cela nécessite également que vous ayez un fichier nommé .gitmessage dans votre répertoire personnel.

2
PhPGuy