Git 预提交钩子单元测试

Git 预提交钩子单元测试,git,bash,shell,terminal,githooks,Git,Bash,Shell,Terminal,Githooks,我正在尝试运行一个预提交钩子,如果我的单元测试没有运行,它会阻止我提交。现在我有一个运行测试的shell脚本,我的终端告诉我测试失败了,这很好。但我不确定在我的Shell脚本中放入什么,一旦我的终端检测到我的测试失败,就可以停止我的提交。 这样地: 我倾向于认为我所缺少的只是一个简单的if语句,它检查测试是否失败,然后停止提交,如果测试通过,然后完成提交。但我可能完全错了,这是我第一次使用shell脚本,所以我真的不知道如何去做。谢谢。当测试失败时,您需要确保脚本以非零退出代码退出 从Git文

我正在尝试运行一个预提交钩子,如果我的单元测试没有运行,它会阻止我提交。现在我有一个运行测试的shell脚本,我的终端告诉我测试失败了,这很好。但我不确定在我的Shell脚本中放入什么,一旦我的终端检测到我的测试失败,就可以停止我的提交。 这样地:


我倾向于认为我所缺少的只是一个简单的if语句,它检查测试是否失败,然后停止提交,如果测试通过,然后完成提交。但我可能完全错了,这是我第一次使用shell脚本,所以我真的不知道如何去做。谢谢。

当测试失败时,您需要确保脚本以非零退出代码退出

从Git文档:

以非零状态退出此脚本会导致git commit命令在创建提交之前中止

基本上,如果测试失败,则退出1,否则退出0。现在,您可能正在所有情况下执行退出0(或让脚本结束)

最有可能的是,单元测试已经返回了一个有效的退出代码,您可以使用它来确定脚本的退出代码

一个简单的方法是:

<run unit tests>
EXIT_CODE=$?
...
exit EXIT_CODE

退出代码=$?
...
退出代码

这个.git/hooks/pre-commit中的简单shell脚本对我很有用

#!/bin/sh
npm run test || exit 1

如果npm运行测试失败,它将通过退出控制,退出控制失败,错误代码为正,终止程序。如果它通过,则永远不会执行exit语句。

我了解不同的退出代码,但我仍然不完全清楚在If语句中放置什么。这就是我现在对形势的理解。只是把它放在伪代码中:if testsFail{exit 1}else{exit 0}我应该为if语句而烦恼吗?如果是这样的话,我应该在它的条件部分放什么?谢谢
如果testsFail{exit 1}或者{exit 0}
-没关系。或者您可以执行
testFail&&exit 1 | | exit 0
@phd,但是在if语句中我应该编写什么来代替testFail呢?我刚刚编写了testFail作为一个伪代码示例。我不确定我应该在关键字后面写些什么来检查测试是否失败。如果我不清楚,很抱歉:(我们如何知道?我们在您的问题中没有看到任何代码…也许可以提供更多详细信息。具体来说,您使用哪个命令来运行测试,以及您的脚本在运行该命令后做了什么?另外,知道
$?
变量显示最后一个退出代码可能会有所帮助。这在终端和scrip中都起作用测试命令通常会返回失败的退出代码。因此,要么将其作为脚本中的最后一项,要么将
set-e
放在脚本顶部,要么将
|exit 1
放在它之后