我怎么能这样git拒绝推送无法编译的代码?

时间:2010-12-27 20:01:44

标签: git hook compilation push

我想在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)环境变量)

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:1)

我们通过在开发人员的工作路径中使用gerrit以及其他人看到的内容来实现此目的。需要两个人犯一个错误,为其他人打破东西。

我们还使用buildbot(用于持续集成),以便我们可以在代码“公开”之前在所有计算机上运行构建。