Git预推钩在不止一次检查的情况下不会中止推送

时间:2018-05-23 16:49:25

标签: git shell githooks yarnpkg

在git hooks中 - 我想在推送之前检查jshint错误和纱线完整性检查,所以我在预推中添加了下面的内容。 所以它是这样的 -

    # Pre-push hooks
    # Lint stuff before committing
    grunt jshint eslint tslint
    # Verifies that versions and hashed value of the package contents 
      in the project’s package.json matches that of yarn’s lock file.
    yarn check --integrity
  • 如果jshint出现错误但是如果纱线完整性检查通过,则仍然如此 它允许推动。如果纱线失效,它将中止。
  • 如果我撤销订单,那么如果纱线检查失败并且jshint通过, 然后它也推了推。如果jshint失败,它将中止。

所以只有在最后一次检查失败的情况下它才会失败,而在其他情况下它会说明错误但仍会推送它

1 个答案:

答案 0 :(得分:5)

这真是一个关于编写脚本的问题。

在sh / bash脚本中,一系列命令只运行一系列命令:

cmd1
cmd2
cmd3

任何一个命令“失败”都没关系(返回非零退出状态);脚本继续运行下一个。

脚本的最终退出状态是最后运行的命令的退出状态,除非您提供特定状态:

exit 0

(零意味着成功)。

如果您希望在任何命令失败时立即退出,可以设置-e选项:

set -e
cmd1
cmd2
cmd3

这是相当粗糙的,并不总是正确的事情。请注意,如果cmd2失败(退出非零),则cmd3甚至不会启动,但shell会以cmd2的失败退出状态退出。

要特别喜欢,您可以保存每个命令的退出状态:

cmd1; cmd1_status=$?
cmd2; cmd2_status=$?
cmd3; cmd3_status=$?

$?变量会扩展到刚刚运行的命令的退出状态。

当然,现在您必须弄清楚如何处理这三种状态,因为您只能使用一个退出,但现在您可以先退出任何一个失败的状态,如果有的话:

test $cmd1_status != 0 && exit $cmd1_status
test $cmd2_status != 0 && exit $cmd2_status
exit $cmd3_status

现在,您的脚本无条件地运行所有三个命令,但返回第一个非零故障的状态。如果cmd1和cmd2都返回零状态,则脚本将以cmd3中的状态退出。