Как добавить имя ветки Git к сообщению фиксации? - PullRequest
88 голосов
/ 05 мая 2011

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

Ответы [ 9 ]

163 голосов
/ 17 июля 2012

Вот мой 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 "$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 .

47 голосов
/ 05 мая 2011

Используйте prepare-commit-msg или commit-msg githook .

В вашем каталоге PROJECT/.git/hooks/ уже есть примеры.

В качестве меры безопасности вам нужно будет вручную включить такой хук в каждом репозитории, в котором вы хотите его использовать. Однако вы можете зафиксировать скрипт и скопировать его на всех клонах в каталог .git/hooks/.

28 голосов
/ 24 июня 2013

Немного более простой скрипт, который добавляет имя ветки к сообщению фиксации до того, как вы его отредактируете.Поэтому, если вы хотите изменить или удалить его, вы можете.

Создать этот файл .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
25 голосов
/ 07 ноября 2014

Вы можете сделать это с помощью комбинации hooks prepare-commit-msg и 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

Установить права доступа

sudo chmod 755 .git/hooks/prepare-commit-msg
sudo chmod 755 .git/hooks/pre-commit
9 голосов
/ 11 сентября 2013

добавить приведенный ниже код в файл 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. Merge-commit содержит информацию о ветвях по умолчанию , поэтому дополнительное имя ветки не нужно и делает сообщение уродливым.

4 голосов
/ 28 сентября 2016

Вдохновленный ответом Тима, который основан на верхнем ответе, оказывается, что ловушка prepare-commit-msg принимает в качестве аргумента , какой тип фиксации происходит .Как видно по умолчанию prepare-commit-msg, если $ 2 равен 'merge', то это коммит слияния.Таким образом, переключение регистра может быть изменено, чтобы включить функцию Tim 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 $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
3 голосов
/ 26 июня 2018

Если вы хотите сделать его глобальным (для всех проектов):

Создайте git-msg файл с содержанием ответа Шытикова и поместите его в какую-нибудь папку:

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

Теперь включите ловушки:

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

и git init снова в каждом проекте, который вы хотите использовать.

1 голос
/ 09 марта 2018

У меня были проблемы с получением этих решений для работы на 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 в вашем домашнем каталоге.

0 голосов
/ 27 февраля 2018

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

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

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