Добавить номер заявки, используя git commit hooks? - PullRequest
23 голосов
/ 28 апреля 2011

Таким образом, моя ветка названа в честь номера билета bugtracker, что-то вроде «issue-1234», и у нас есть соглашение всегда записывать номер билета в сообщении коммита. Я спрашиваю себя, возможно ли добавить номер заявки в сообщение о коммите автоматически, когда я работаю над веткой проблем- * без явного его ввода.

Я посмотрел на хиты git commit, а именно pre-commit, prepare-message и post-commit, и ни один из них, похоже, не смог сделать то, что я хотел. Хук после фиксации подходит близко, но вы не можете изменить сообщение, зафиксированное с -m.

Повторюсь, мне интересно, возможно ли это:

О филиале: выпуск-1234

git commit -a -m"fixed this pesky issue"

После коммита в git log это сообщение отображается как:

fixed this pesky issue. ticket number: #1234

Ответы [ 6 ]

18 голосов
/ 29 апреля 2011

Вы пропустили крючок.То, что вам нужно, это commit-msg:

Этот хук вызывается git commit и может быть обойден с опцией --no-verify.Он принимает единственный параметр - имя файла, в котором хранится предлагаемое сообщение в журнале фиксации.Выход с ненулевым статусом приводит к прерыванию git commit.

Так, например:

#!/bin/sh

ticket=$(git symbolic-ref HEAD | awk -F- '/^issue-/ {print $2}')
if [ -n "$ticket" ]; then
    echo "ticket #$ticket" >> $1
fi

Это очень наивный анализ вашего имени ветки, и он просто добавляетсясообщение коммита в отдельной строке.Измените его, если этого недостаточно для вас.

Конечно, я бы действительно рекомендовал сделать это в prepare-commit-msg и зафиксировать с помощью git commit (без -m).Очень, очень редко вы можете написать достаточно информации в однострочном коммит-сообщении.Кроме того, это позволит вам увидеть сообщение до того, как будет сделан коммит, в случае, если ваш хук не делает то, что вам нужно.

7 голосов
/ 19 июля 2014

Вы также можете использовать prepare-commit-msg hook, который принимает больше параметров, чем commit-msg. Затем вы можете проверить, приходит ли сообщение из файла, шаблона и т. Д., Чтобы избежать добавления номеров ошибок, когда вы этого не хотите.

При использовании следующего сценария в .git/hooks/prepare-commit-msg, когда вы работаете в ветви функций с именем foo-123, [#123] будет добавляться к третьей строке каждого сделанного вами коммита.

Больше информации в этом посте я написал

#!/bin/sh

if [ x = x${2} ]; then
  BRANCH_NAME=$(git symbolic-ref --short HEAD)
  STORY_NUMBER=$(echo $BRANCH_NAME | sed -n 's/.*-\([0-9]\)/\1/p')
  if [ x != x${STORY_NUMBER} ]; then
    sed -i.back "1s/^/\n\n[#$STORY_NUMBER]/" "$1"
  fi
fi
2 голосов
/ 23 октября 2014

Таким образом, вы можете добавить имя ветки в начало сообщения коммита. Это готовить-коммит-сообщение. Работают как для команд "git commit -m", так и для "git commit". Опция - это файл .git / hooks / pre-commit.skip, который содержит список веток, которые вы не хотите автоматически добавлять.

BRANCH="$(git rev-parse --abbrev-ref HEAD)"
FILE_CONTENT="$(cat $1)"
skip_list=`git rev-parse --git-dir`"/hooks/pre-commit.skip"
if grep -E "^$BRANCH$" $skip_list; then
  exit
fi
if [ $2 = "message" ]; then
  echo $BRANCH: $FILE_CONTENT > $1
else
  echo $BRANCH: > $1
  echo $FILE_CONTENT >> $1
fi
2 голосов
/ 28 апреля 2011

Другой вариант - использовать git notes для добавления информации о номере билета в коммит, используя один из упомянутых хуков.
(См. «Заметки к себе» запись в блоге для получения дополнительной информации о механизме заметок)

1 голос
/ 08 июня 2018

Вот полное решение для любых сообщений о коммитах номеров / заявок:

prepare-commit-msg

#!/bin/bash
# Append issue number / bug tracking URL to commit.
#
# If the branch name contains the issue number, it will append it to the
# commit message. Example:
#
#   BRANCH NAME            LINE TO APPEND
#   feature/GH-123-emoji   GitHub: #123
#   WRIKE-123-add-payment  Wrike: https://www.wrike.com/open.htm?id=123
#   UNKNOWN-123            Issue: #123

branchName=`git rev-parse --abbrev-ref HEAD`

IFS=- read issueTracker issueNumber <<< $(echo $branchName | sed -nr 's,([a-z-]+/)?([A-Z]+-[0-9]+)-.+,\2,p')

if [[ -z $issueNumber ]]; then
  exit 0
fi

case "$issueTracker" in
  WRIKE)
    line="Wrike: https://www.wrike.com/open.htm?id=$issueNumber"
    ;;
  GH)
    line="GitHub: #$issueNumber"
    ;;
  GL)
    line="GitLab: #$issueNumber"
    ;;
  *)
    line="Issue: #$issueNumber"
    ;;
esac

# If the commit message already contains the line (`--amend`), then do
# not add it again.
if ! ( grep "$line" "$1" > /dev/null ); then
  sed -i.bak -e "/# Please enter the commit message for your changes./ s,^,$line\n\n," $1
fi

Поместите его в каталог .git/hooks репозитория, чтобы применять его только крепозиторий или настройте core.hooksPath в ~/.gitconfig и скопируйте в этот каталог для применения ко всем вашим репозиториям.

См. в мой репозиторий конфигурационных файлов помимо других полезных скриптов.

0 голосов
/ 04 января 2019

Использование pre-commit вместе с хуком giticket хорошо работает для автоматического добавления номера билета в коммит.

...