我如何才能让git拒绝推送赢得';不编译?

我如何才能让git拒绝推送赢得';不编译?,git,hook,compilation,push,Git,Hook,Compilation,Push,我想为git添加一个更新钩子,防止人们推送无法编译的java代码。理想情况下,它将调用javac,查看结果,并允许或拒绝推送 我想阻止的最常见的例子是有人没有提交所有更改,从而破坏了构建。然而,据我所知,git钩子是在客户机(而不是服务器)上运行的,因此如果发生上述情况,钩子仍将允许推送 防止人们用不完整的提交破坏构建的最佳方法是什么 更新: 得到了一个钩子工作的原始版本,感谢所有的帮助 摘自更新挂钩: ### make sure code compiles ## currently does

我想为git添加一个更新钩子,防止人们推送无法编译的java代码。理想情况下,它将调用javac,查看结果,并允许或拒绝推送

我想阻止的最常见的例子是有人没有提交所有更改,从而破坏了构建。然而,据我所知,git钩子是在客户机(而不是服务器)上运行的,因此如果发生上述情况,钩子仍将允许推送

防止人们用不完整的提交破坏构建的最佳方法是什么

更新:

得到了一个钩子工作的原始版本,感谢所有的帮助

摘自更新挂钩:

### make sure code compiles
## currently does this by copying the state of the repository as of the pushed code and attempting to build it

# for now, hard coded as C:\Windows\Temp
copydir="/c/Windows/Temp/git_hook_compile_copy"

echo "making copy of $newrev to $copydir" >&2
rm -rf "$copydir"
mkdir "$copydir"
git archive $newrev | tar -x -C $copydir/
if [ "$?" != "0" ]; then
    echo "*** unable to make copy of code" >&2
    exit 1
fi
echo "attempting to build $newrev" >&2
"$ANT_HOME/bin/ant" -file "$copydir/appropriatePath/build.xml"
if [ "$?" != "0" ]; then
    echo "*** code does not compile" >&2
    exit 1
fi

(请注意,这是针对windows环境的,并且依赖于定义的ANT_HOME(以及JAVA_HOME)环境变量)

Git服务器和客户端没有太大区别;-)。因此,如果服务器上发生相同的事件,那么在“客户机”上运行的所有钩子都将在“服务器”上运行

例如,
update
hook完全属于这一类。它是在分支更新后调用的,如果这个钩子返回非零状态,更新将被取消。因此,您可能希望将编译放在那里,并返回其结果。您从hook打印的所有消息都将显示给在其控制台上提交的用户。这非常方便,因为他可以看到构建脚本中的错误消息,并对其进行修复

即使同时运行两个编译,git存储库也不会因为在其更新挂钩中使用“old refname”参数而丢失提交。然而,提交者可能会等待编译,而他的ref不会被推送,因为其他人推送了他的ref

默认的git存储库包含一个很好的
update
hook(名为
update.sample
)示例。如果你需要一个明确的例子,请参考它

但是,如果编译太长,并且提交速率超过了编译代码的频率,则可能需要使用更高级的解决方案。评论者建议在谷歌中寻找“持续集成”。

我们这样做是通过让开发人员在工作的道路上和其他人看到的东西。只有两个人才会犯一个错误,为别人破坏东西


我们还可以在代码“公开”之前跨所有机器运行构建(用于持续集成)。

每次推送时编译项目的成本可能会高得让人望而却步;如果是这样的话,“持续集成”就是谷歌的目标。关于持续集成,我也是它的超级粉丝,我们的主要项目是哈德逊。这是一个次要项目,我只想要一些真正简单的东西,防止人们签入破坏构建的代码,这样就没有其他人(在本例中是运行脚本的虚拟机)可以签出破坏的构建。对于我的小型次要项目,我只需要做一个运行单元测试的
预提交
钩子。那么我就不能提交任何不编译和通过测试的东西。