Git Hooks
钩子(hooks)是一些在$GIT-DIR/hooks
目录的脚本, 在被特定的事件(certain points)触发后被调用。当git init
命令被调用后, 一些非常有用的示例钩子脚本被拷到新仓库的hooks目录中; 但是在默认情况下它们是不生效的。 把这些钩子文件的".sample"文件名后缀去掉就可以使它们生效。
applypatch-msg
GIT_DIR/hooks/applypatch-msg
这个钩子是由git am
命令调用的。它只有一个参数:就是存有将要被应用的补丁(patch)的提交消息(commit log message)的文件名。如果钩子的返回值不是0
,那么git am
就会放弃对补丁的应用(apply the patch)。
这个钩子可以在工作时(译注:也就是在git am
运行时)编辑提交(commit)信息文件(message file)。它的一个用途是把提交(commit)信息规范化,使得其符合一些项目的标准(如果有的话)。它也可以用来在分析(inspect)完消息文件后拒绝某个提交(commit)。
如果默认的applypatch-msg.sample
钩子被启用,它会调用commit-msg
钩子(如果它也被启用的话)。
pre-applypatch
GIT_DIR/hooks/pre-applypatch
这个钩子是由git am
命令调用的。它不需要参数,并且是在一个补丁(patch)被应用后还未提交(commit)前被调用。如果钩子的返回值不是`0``,那么刚才应用的补丁(patch)就不会被提交。
它可以用于检查当前的工作树(译注:此时补丁已经被应用但没有被提交),如果补丁不能通过测试就拒绝此次提交(commit)。
如果默认的pre-applypatch.sample
钩子被启用,它会调用pre-commit
钩子(如果它也被启用的话)。
post-applypatch
GIT_DIR/hooks/post-applypatch
这个钩子是由git am
命令调用的。它不需要参数,并且是在一个补丁(patch)被应用且在完成提交(commit)情况下被调用。
这个钩子主要用来通知(notification),它并不会影响git-am
的执行结果。
pre-commit
GIT_DIR/hooks/pre-commit
这个钩子被 git commit
命令调用, 而且可以通过在命令中添加\--no-verify
参数来跳过。这个钩子不需要参数,在得到提交消息和开始提交(commit)前被调用。如果钩子返回值不是0
,那么 git commit
命令就会中止执行。
译注:这个钩子可以用来在提交前检查代码错误(例如运行lint程序)。
当默认的pre-commit
钩子被启用时,如果它发现文件尾部有空白行,那么就会中止此次提交。
译注:新版的默认钩子和这里所说有所有不同。
如果(进行git commit
的)命令没有制定一个编辑器来修改提交信息(commit message),任何的 git-commit
钩子(译注:即无论是否自带)被调用时都会带上环境变量GIT_EDITOR=:
下面是一个运行 Rspec 测试的 Ruby 脚本,如果没有通过这个测试,那么不允许提交(commit)。
html_path = "spec_results.html" `spec -f h:#{html_path} -f p spec` # run the spec. send progress to screen. save html results to html_path # find out how many errors were found html = open(html_path).read examples = html.match(/(\d+) examples/)[0].to_i rescue 0 failures = html.match(/(\d+) failures/)[0].to_i rescue 0 pending = html.match(/(\d+) pending/)[0].to_i rescue 0 if failures.zero? puts "0 failures! #{examples} run, #{pending} pending" else puts "\aDID NOT COMMIT YOUR FILES!" puts "View spec results at #{File.expand_path(html_path)}" puts puts "#{failures} failures! #{examples} run, #{pending} pending" exit 1 end
prepare-commit-msg
GIT_DIR/hooks/prepare-commit-msg
执行git commit
命令后,在默认提交消息准备好后但编辑器(editor)启动前,这个钩子就被调用。
It takes one to three parameters. The first is the name of the file
它接受一到三个参数。第一个包含了提交消息的文本文件的名字。第二个是提交消息的来源,它可以是: * message
(如果指定了-m
或者-F
选项) * template
(如果指定了-t
选项,或者在设置(译注:即git config
)中开启了commit.template
选项) * merge
(如果本次提交(commit)是一次合并(merge),或者存在文件.git/MERGE_MSG
) * squash
(如果存在文件.git/SQUASH_MSG
) * commit
并且第三个参数是一个提交(commit)的SHA1值(如果指定了-c
,-C
或者\--amend
选项)
如果钩子的返回值不是0
,那么git commit
命令就会被中止执行。
这个钩子的目的是用来在工作时编辑信息文件,并且不会被\--no-verify
选项略过。一个非0
值意味着钩子工作失败,会终止提交(abort the commit)。它不应该用来作为pre-commit
钩子的替代。
git提供的样本prepare-commit-msg.sample
会把当前合并提交信息(a merge's commit message)中的Conflicts:
部分注释掉。