在git hook中获取提交消息

时间:2011-03-22 14:57:24

标签: git hook

我想在git commit之前检查提交消息。 我使用预提交钩子来做到这一点,但无法在.git / pre-commit脚本中找到获取提交消息的方法。 我怎么能得到它?

4 个答案:

答案 0 :(得分:26)

pre-commit挂钩中,提交消息通常尚未创建¹。您可能希望使用其中一个prepare-commit-msgcommit-msg挂钩。运行这些钩子的顺序有一个nice section in Pro Git,以及你通常可以用它们做什么。

<子> ¹例外情况是提交者可能提供了-m的提交消息,但pre-commit挂钩仍然无法访问该消息,而prepare-commit-msg或{{1 }}

答案 1 :(得分:6)

我在commit-msg钩子中实现了这一点。请参阅documentation

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

答案 2 :(得分:1)

挂钩名称应为:

commit-msg,否则将不会被调用:

答案 3 :(得分:0)

您可以在pre-receive挂钩(服务器端)中执行以下操作,这将显示修订信息。

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])