如何测试git hooks

时间:2012-07-16 20:38:11

标签: git git-post-receive

由于“测试”是Git钩子的常用用途,我的问题很难搜索。

我正在写一个相当复杂的git post-receive hook,想知道测试它的最佳方法是什么。目前我的流程是:

  • 在虚拟“远程”仓库中进行后期接收更改
  • 对虚拟本地仓库进行更改
  • 在虚拟本地仓库中提交更改
  • 将更改推送到虚拟远程仓库

有没有更简单的方法来测试它?理想情况下它看起来像:

  • 在虚拟仓库中进行更改后接收
  • 发出“魔术”命令以测试收到后

也许我可以“重新发布”之前的推送,或者让远程仓库表现得像是刚刚接收到具有特定哈希的推送?

4 个答案:

答案 0 :(得分:15)

编写一个只记录其参数/环境的钩子并将其转储到文件中。然后你可以用相同的环境/参数重新调用真正的钩子,它就像你刚刚重新发出完全相同的推动一样。

答案 1 :(得分:10)

回答这个有四年之久的问题。

如果您想在本地环境中测试挂钩,我会提供详细的后续跟踪命令,使用post-receive作为示例:

$ mkdir /tmp/hook_test
$ cd /tmp/hook_test

# set local git repo, where you put hooks in it.
$ git clone --bare https://github.com/git/git.git

# set develop environment which is cloned from the new created repo. 
$ git clone git.git repo 

# copy and rename the hook you need test to "post-receive"
$ cd git.git/hooks
$ cp ~/post-receive-test post-receive

# suppose the hook script is bash script.
# edit "post-receive" and add "set -x" to second line in it to active debug

$ cd /tmp/hook_test/repo
# emulate a hook trigger, do some changes, "git add" and "git commit" it 

$ git push

# Now you should see the script "post-receive" runs automatically with debug details.

您应该可以自由运行git push,更新只会推送到本地仓库/tmp/hook_test/git.git

答案 2 :(得分:1)

我的方法是在远程仓库回拨一次提交的HEAD,然后再次按下:

ssh <repo> 'cd /<repo_path>; git update-ref refs/heads/master HEAD^' && git push origin master

答案 3 :(得分:0)

对于调试,您还可以通过以下方式结束钩子:

echo "No errors found."
exit 1

如果您对自己喜欢的话很满意,当然可以再取出最后一行。