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

Zug*_*alt 9 git hook push compilation

我想为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
Run Code Online (Sandbox Code Playgroud)

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

P S*_*ved 4

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

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

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

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

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

  • 每次推送时编译一个项目可能会非常昂贵;如果是这样,“持续集成”就是谷歌搜索的内容。 (6认同)