由命令行控制的Git条件预提交挂钩:这是否可能?

9
我们有一个很好的GIT pre-commit钩子和commit-msg。Pre-commit钩子执行语法验证,commit-msg执行其他业务逻辑。一切都很顺利。
然而,我想在pre-commit钩子中添加代码规范验证。实际上,它已经添加了。但是,我不想强制开发人员严格遵循编码标准,默认情况下我想验证代码是否符合标准,但如果他们想通过添加参数来跳过编码标准验证,则允许他们这样做。
在pre-commit hook级别捕获/解释提交到git的任何命令行参数以便在pre-commit hook中跳过编码标准验证(可选)是否可能?
或者只能在分析提交消息以查找特定子字符串的commit-msg hook中实现此目的?
请分享您的最佳实践,关于如何(以及在哪里)使用git pre-commit hook(或其他git hooks)创建命令行控制的条件代码。
2个回答

14

一种简单的方法是直接使用环境变量:

STANDARDS=no git commit

然后在脚本中(以下示例使用Bash,但您可以在任何语言中读取环境变量):

if [ "$STANDARDS" != "no" ]; then
    ...check for code standards...
fi

通常情况下,Git不会将除 man githooks 中列出的信息传递给每个挂钩,因此尝试通过“命令行选项”(例如git commit --no-standards)等方式来实现这一点是行不通的。


2
甚至可以将其添加到仓库的git配置文件中。这样他们在从命令行提交时也可以使用“-c”选项覆盖。 - sergiopereira
1
@sergiopereira 你能详细阐述你的想法/给出一个使用示例吗? - bloody
1
对我来说,只有在变量之前添加“export”才能正常工作:export STANDARDS=no git commit .. 无论如何+1,这是简单中的天才。 - bloody
2
@bloody 就像环境变量的想法一样,但是值将存储在 git 配置中(本地或全局)。Bash 脚本将检查 if [ "$(git config standards)" != "no" ]。默认值可以在 git 配置中,但仍可使用 git -c standards=no commit -m "my commit message" 进行覆盖。 - sergiopereira
@sergiopereira 这也很好,我不知道使用-c与“inline”设置。谢谢! - bloody

6

补充@Amber所说的,你应该能够执行以下操作:

STANDARDS=no git commit -m "committing"

并且需要适当的pre-commit hook,该hook将查看环境变量并作出决策。

当然有--no-verify选项,但我想你不想跳过整个pre-commit:

-n
--no-verify

此选项可以绕过pre-commit和commit-msg hooks。请参见githooks(5)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接