Как добавить имя в Git ветке в сообщения для коммита?
Мне нужна помощь с сценарием Bash, который автоматически добавит имя ветви git в качестве хэша в сообщениях о фиксации.
9 ответов:
использовать
prepare-commit-msg
илиcommit-msg
githook.есть примеры уже в свой .
вот мой
commit-msg
сценарий в качестве примера:#!/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 "") > "" if [ -n "$DESCRIPTION" ] then echo "" >> "" echo $DESCRIPTION >> "" fi
создает следующее сообщение:
[branch_name]: [original_message] [branch_description]
Я использую номер как
branch_name
, описание проблемы находится наbranch_description
используя
немного более простой скрипт, который добавляет имя ветки в сообщение фиксации до редактировать. Так что если вы хотите изменить или удалить его можно.
создайте файл .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 ) if [ -z "$firstLine" ] ;then #Check that this is not an amend by checking that the first line is empty sed -i "1s/^/$branchName: \n/" #Insert branch name at the start of the commit message file fi
вы можете сделать это с помощью комбинации крючков prepare-commit-msg и pre-commit.
.git / hooks / prepare-commit-msg
#!/bin/sh BRANCH=`git branch | grep '^\*' | cut -b3-` FILE=`cat ""` echo "$BRANCH $FILE" > ""
.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
установить разрешения
sudo chmod 755 .git/hooks/prepare-commit-msg sudo chmod 755 .git/hooks/pre-commit
добавьте приведенный ниже код в файл prepare-commit-msg.
#!/bin/sh # # Automatically add branch name and branch description to every commit message except merge commit. # COMMIT_EDITMSG= 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. слияние-фиксация имеет информацию о филиале по умолчанию таким образом, дополнительное имя ветви не нужно и делает сообщение уродливым.
вдохновленный ответом Тима, который основывается на верхнем ответе, оказывается, что крючок prepare-commit-msg принимает как аргумент какой тип фиксации происходит. Как видно из стандартного prepare-commit-msg, если $2 является "слиянием", то это слияние. Таким образом, переключатель case может быть изменен, чтобы включить функцию addBranchName() Тима.
Я включил свои собственные предпочтения о том, как добавить имя ветви, и все раскомментированные части по умолчанию
prepare-commit-msg.sample
крюк.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 | 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'{="\('$NAME'/\): "}1;' > tmp_msg && mv tmp_msg "" else echo "title\n\n($NAME/):\n`cat `\n" > "" fi } # You might need to consider squashes case "," 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' "" ;; # Non-merges with no prior messages *) addMyBranchName ;; esac
у меня были проблемы с получением этих решений для работы на MacOS из-за того, что он использует BSD
sed
вместо GNUsed
. Мне удалось создать простой скрипт, который делает эту работу, хотя. Все еще используя.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
это предполагает стандарт именования ветвей, аналогичный
functional-desc_JIRA-NUMBER
. Если ваше имя филиала-это только ваш номер билета Jira, вы можете просто избавиться от всего, от трубы до f2. Это также требует, чтобы у вас был файл с именем.gitmessage
в вашем домашнем каталоге.
если вы хотите сделать его глобальным (для всех проектов):
создать
git-msg
файл с содержимым shytikov по, и положить его в какую-то папку:mkdir -p ~/.git_hooks # make it executable chmod a+x ~/.git_hooks/commit-msg
теперь включить крючки:
git config --global init.templatedir '~/.git_hooks'
и
git init
снова в каждом проекте вы хотите использовать его.