Git预推钩

she*_*ker 103 git hook

我想在每次git推送之前运行一个单元测试,如果测试失败,取消推送,但我甚至找不到预推钩,只有pre-commit和pre-rebase.

man*_*lds 199

Git pre-push1.8.2发布中获得了优势 .

示例pre-push脚本:https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

1.8.2发布说明谈论新的预推钩:https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt

  • 这需要是公认的答案. (9认同)

Jim*_*ane 23

Git在1.8.2版本中获得了预推钩.

预推钩是我需要的预提交钩子.除了保护分支外,它们还可以提供额外的安全性以及预先提交的钩子.

并举例说明如何使用(从这个漂亮的条目中采取和采用和增强)

登录vagrant,运行测试然后推送的简单示例

#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push

CMD="ssh vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key 'cd /vagrant/tests; /vagrant/vendor/bin/phpunit'"
protected_branch='master'

# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
    exit 0
fi

current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

if [[ $current_branch = $protected_branch ]]; then
    eval $CMD
    RESULT=$?
    if [ $RESULT -ne 0 ]; then
        echo "failed $CMD"
        exit 1
    fi
fi
exit 0
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该示例使用受保护的分支,即预推钩的主题.


ord*_*rig 19

我宁愿在pre-commit-hook中运行测试.因为提交时已经记录了更改.仅推送和拉取已记录已更改的交换信息.如果测试失败,您的存储库中已经有一个"损坏"的版本.无论你是否推动它.

  • 我普遍同意,但是如果你习惯于在以后进行大量的增量提交,并且测试套件很大,那么这可能是不切实际的. (176认同)
  • 投票结果是因为 - 虽然提供了信息 - 它完全忽略了OP的问题. (11认同)
  • 这不是问题的答案。这只是个人意见,因此不属于答案 (8认同)
  • @ calder.ty - 不.manojlds更好地解决了重要问题.实际上,运行测试的预提交钩子通常是一个坏主意.它假定所有提交的内容都必须通过测试.这对于专注于协作的常见工作流程来说是不利的.所以...我不同意; 它不是更好的做"它"的方式,也不是解决问题. (7认同)
  • 如果回复者只想分享他们的意见,则适当的回复应该是 1) 回复评论,或 2) 按预期回答问题,然后在问题下方提供他们的个人意见以获得更好的可见性。 (3认同)
  • 这并没有真正回答原始问题。看起来它应该是一条评论。 (2认同)

kub*_*ubi 13

如果您使用的是命令行,最简单的方法是编写一个运行单元测试的推送脚本,如果成功,则完成推送.

编辑

从git 1.8.2开始,这个答案已经过时了.请参阅上面manojlds的回答.


Jak*_*org 7

没有钩子,因为推送不是修改存储库的操作.

你可以在post-receive钩子上对接收方进行检查.那是你通常拒绝传入推送的地方.在钩子中运行单元测试可能有点密集,但这取决于你.


Tur*_*adg 5

为了记录,有一个Git 1.6补丁添加了一个预推钩.我不知道它是否适用于1.7.

你可以运行像@kubi推荐的推送脚本,而不是弄乱它.你也可以把它变成一个Rake任务,所以它在你的回购中.ruby-git可以帮助解决这个问题.如果检查目标仓库,则只能在推送到生产仓库时运行测试.

最后,您可以在pre-commit钩子中运行测试,但检查正在提交的分支.然后,您可以拥有一个production分支,在接受提交之前需要所有测试通过,但您master不关心.limerick_rake在这种情况下可能很有用.