Как добавить имя в Git ветке в сообщения для коммита?


Мне нужна помощь с сценарием Bash, который автоматически добавит имя ветви git в качестве хэша в сообщениях о фиксации.

9 71

9 ответов:

использовать prepare-commit-msg или commit-msggithook.

есть примеры уже в свой .

вот мой 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 вместо GNU sed. Мне удалось создать простой скрипт, который делает эту работу, хотя. Все еще используя .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 снова в каждом проекте вы хотите использовать его.

нет никакой причины для grep, а затем трубы для sed.

поскольку наши ветви являются нашей проблемой jira, мы всегда должны добавлять нашу jira к сообщению фиксации (которое совпадает с именем ветви).

$ git commit -m "$(git branch | sed -n 's/\* //p'): message"