Практический пример использования 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"* ]]
Это необходимо для защиты от:
- пустой номер билета, когда скрипт не может его извлечь
- избыточный номер билета, когда сообщение уже содержит его (например, при внесении изменений)
Это все. Спасибо за чтение!