我想在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)环境变量)
答案 0 :(得分:4)
Git服务器和客户端差别不大;-)。因此,如果服务器上发生相同的事件,那么在“客户端”上运行的所有挂钩都将在“服务器”上运行。
例如,update
钩子,完全属于这一类。在更新分支后调用它,如果此挂钩返回非零状态,则更新将被取消。所以你可能想把编译放在那里,然后返回它的结果。您从钩子打印的所有消息都将显示给在其控制台上提交的用户。这非常方便,因为他可以从构建脚本中看到错误消息并进行修复。
即使您同时运行两个编译,git存储库也不会丢失提交,因为在其更新挂钩中使用了“old refname”参数。然而,可能会发生一个提交者等待编译,并且他的引用没有被推动,因为其他人推了他的那个。
默认的git存储库包含一个update
钩子(名为update.sample
)的一个很好的例子。如果您需要一个明确的例子,请参阅它。
但是,如果编译太长,并且提交率超过了您可以编译代码的频率,则可能需要使用更高级的解决方案。评论者建议在谷歌中寻找“持续整合”。
答案 1 :(得分:1)