40

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

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

  • 在一个虚拟的“远程”仓库中对 post-receive 进行更改
  • 更改虚拟本地存储库
  • 在虚拟本地仓库中提交更改
  • 将更改推送到虚拟远程仓库

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

  • 对虚拟回购中的接收后进行更改
  • 发出“魔术”命令来测试接收后

也许我可以“重新发布”以前的推送,或者让远程仓库就像它刚刚收到带有特定哈希的推送一样?

4

4 回答 4

16

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

于 2012-07-16T20:47:59.797 回答
15

回答这个四年前的问题。

如果你想测试钩子,你需要先在本地环境中测试,我给出了后续的详细命令,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

于 2016-09-05T02:12:13.087 回答
5

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

ssh <repo> 'cd /<repo_path>; git update-ref refs/heads/master HEAD^' && git push origin master
于 2018-12-07T20:30:21.107 回答
2

对于调试,你也可以像这样结束你的钩子:

echo "No errors found."
exit 1

如果你对你的钩子感到满意,你当然会再次取出最后一行。

于 2020-04-03T13:00:07.870 回答