Практический пример использования git-хука prepare-commit-msg

Вам не нужно вводить номер тикета вручную для каждой фиксации!

Как только имя ветки будет содержать эту ссылку, вы можете настроить ловушку git, которая сделает это за вас!

Git позволяет вам перехватить сообщение фиксации с помощью prepare-commit-msg крючка.

Этот хук - исполняемый файл, который Git вызывает прямо перед фиксацией. Он принимает единственный аргумент - целевое имя файла, содержащее сообщение фиксации.

# GIT executes the prepare-commit-msg hook internally like:
$ .git/hooks/prepare-commit-msg .git/COMMIT_EDITMSG

Задача - подготовить собственное сообщение на основе имени ветки и записать его обратно в .git/COMMIT_EDITMSG файл.

Вот пример реализации в bash:

#!/bin/bash
FILE=$1
MESSAGE=$(cat $FILE)
TICKET=[$(git rev-parse --abbrev-ref HEAD | grep -Eo '^(\w+/)?(\w+[-_])?[0-9]+' | grep -Eo '(\w+[-])?[0-9]+' | tr "[:lower:]" "[:upper:]")]
if [[ $TICKET == "[]" || "$MESSAGE" == "$TICKET"* ]];then
  exit 0;
fi

echo "$TICKET $MESSAGE" > $FILE

Переменная TICKET содержит извлеченный номер билета в скобках, например:

  • myproj-123-some-feature[MYPROJ-123]
  • feature/myproj-456-some-other-feature[MYPROJ-456]
  • bugifx/myproj-789[MYPROJ-789]
  • 123_some_feature [123]

Хорошо, теперь скопируйте сценарий, поместите его в your-repo/.git/hooks/prepare-commit-msg и сделайте его исполняемым файлом с помощью команды chmod: chmod +x your-repo/.git/hooks/prepare-commit-msg.

Посмотрите это в действии:

Возможно, вы заметили состояние:

if [[ $TICKET == "[]" || "$MESSAGE" == "$TICKET"* ]]

Это необходимо для защиты от:

  • пустой номер билета, когда скрипт не может его извлечь
  • избыточный номер билета, когда сообщение уже содержит его (например, при внесении изменений)

Это все. Спасибо за чтение!