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.
Utilisez le prepare-commit-msg
ou 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 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.
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 .
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
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
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.
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
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.
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.