Я хочу проверить сообщение commit до git commit. Я использую pre-commit hook для этого, но не смог найти способ получить сообщение фиксации в .git/pre-commit script. Как я мог его получить?
Получить сообщение фиксации в git hook
Ответ 1
В хуке pre-commit
сообщение о фиксации обычно еще не было создано ¹. Вы, вероятно, хотите вместо этого использовать один из prepare-commit-msg
или commit-msg
. В Pro Git есть хороший раздел о порядке запуска этих хуков и о том, что вы обычно можете с ними делать.
¹ Исключением является то, что -m
, возможно, предоставил сообщение коммита с -m
, но сообщение все еще не доступно для ловушки pre-commit
, тогда как оно должно prepare-commit-msg
или commit-msg
Ответ 2
Я реализовал это в тэге commit-msg
. См. документация.
commit-msg
This hook is invoked by git commit, and can be bypassed with the --no-verify option.
It takes a single parameter, the name of the file that holds the proposed commit log message.
Exiting with a non-zero status causes the git commit to abort.
В my_git_project/.git/hooks
я добавил этот файл commit.msg
(должно быть это имя). Я добавил следующее содержимое bash внутри этого файла, который сделал проверку.
#!/usr/bin/env bash
INPUT_FILE=$1
START_LINE=`head -n1 $INPUT_FILE`
PATTERN="^(MYPROJ)-[[:digit:]]+: "
if ! [[ "$START_LINE" =~ $PATTERN ]]; then
echo "Bad commit message, see example: MYPROJ-123: commit message"
exit 1
fi
Ответ 3
Имя крючка должно быть:
commit-msg
, иначе он не будет вызван:
Ответ 4
Вы можете сделать следующее в pre-receive
hook (для сервера), и на нем будет отображаться информация о ревизии.
old, new, branch = sys.stdin.read().split()
proc = subprocess.Popen(["git", "rev-list", "--oneline","--first-parent" , "%s..%s" %(old, new)], stdout=subprocess.PIPE)
commitMessage=str(proc.stdout.readlines()[0])