Мне нужна помощь с Bash script, которая автоматически добавит имя ветки git как хэш в сообщениях фиксации.
Как добавить имя ветки Git в сообщение фиксации?
Ответ 1
Используйте prepare-commit-msg
или commit-msg
githook.
В вашем каталоге PROJECT/.git/hooks/
есть примеры.
В качестве меры безопасности вам придется вручную включить такой крючок в каждом репозитории, который вы хотите использовать. Хотя, вы можете зафиксировать script и скопировать его на все клоны в каталог .git/hooks/
.
Ответ 2
Вот мой commit-msg
script в качестве примера:
#!/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
Создает следующее сообщение об ошибке:
[branch_name]: [original_message]
[branch_description]
Я использую номер проблемы как branch_name
, описание проблемы помещается в branch_description
с помощью команды git branch --edit-description [branch_name]
.
Подробнее о описаниях веток вы можете найти на этом Q & A.
Пример кода хранится в следующем Gist.
Ответ 3
Немного проще script, который добавляет имя ветки в сообщение фиксации до, которое вы его редактируете. Поэтому, если вы хотите изменить или удалить его, вы можете.
Создайте этот файл .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
Ответ 4
Вы можете сделать это с помощью комбинации команд make-commit-msg и pre-commit.
<сильные > .git/крючки/подготовить фиксации-MSG
#!/bin/sh
BRANCH=`git branch | grep '^\*' | cut -b3-`
FILE=`cat "$1"`
echo "$BRANCH $FILE" > "$1"
<сильные > .git/крючки/предварительной фиксации
#!/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
Установить разрешения
sudo chmod 755 .git/hooks/prepare-commit-msg
sudo chmod 755 .git/hooks/pre-commit
Ответ 5
добавьте нижеприведенный код в файле 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
Он добавит имя ветки для фиксации сообщения, кроме merge-commit. Слияние-фиксация имеет информацию о ветвях по умолчанию, поэтому дополнительное имя ветки не требуется и делает сообщение уродливым.
Ответ 6
Вдохновленный ответом Тима, который основывается на верхнем ответе, оказывается, что hook-commit-msg принимает как аргумент, какой тип фиксации происходит. Как видно из default-ready-commit-msg, если $2 является "merge", то это слияние. Таким образом, коммутатор case может быть изменен, чтобы включить функцию Tim addBranchName().
Я включил свои собственные предпочтения в том, как добавить имя ветки и все недокументированные части по умолчанию prepare-commit-msg.sample
.
подготовить фиксации-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