GIT命令行控制的条件预提交钩子:有可能吗?

Tam*_*man 6 git githooks

我们有一个很好的GIT预提交钩子,以及一个很好的commit-msg.预提交钩子执行语法验证,commit-msg执行一些其他业务逻辑.这一切都运作良好.

但是,我想在预提交钩子中添加编码标准验证.事实上,它已经添加了.但是,我不想严格执行我们的开发人员以符合编码标准,默认情况下我想验证标准的代码,但如果他们想通过编码标准验证,我想让他们通过在提交期间添加参数来传递.

是否有可能捕获/解释在提交前提交给git的任何命令行参数,以便在预提交钩子级别跳过编码标准验证(可选?)

或者只能通过分析特定子字符串的提交消息在预提交消息钩子中?

请分享您使用git pre-commit hook(或其他git hooks)创建命令行控制条件代码的方式(以及在何处)的最佳实践.

Amb*_*ber 11

一个简单的方法是简单地使用环境变量:

STANDARDS=no git commit
Run Code Online (Sandbox Code Playgroud)

然后在脚本中(Bash中的例子,但你可以用你的钩子所用的任何语言读取env变种):

if [ "$STANDARDS" != "no" ]; then
    ...check for code standards...
fi
Run Code Online (Sandbox Code Playgroud)

Git通常不会将信息传递man githooks到每个钩子中列出的信息之外,因此尝试使用"命令行选项"la git commit --no-standards或其他类似的信息将无效.

  • 或者甚至将类似的内容添加到存储库的 git 配置文件中。这样,当从命令行提交时,他们还可以使用“-c”选项进行覆盖。 (2认同)
  • @bloody 就像环境变量的想法,但值将存储在 git 配置(本地或全局)中。bash 脚本将检查 `if [ "$(git configstandards)" != "no" ]`。默认值可以在 git config 中,但仍然可以使用 `git -cstandards=no commit -m "my commit message"` 覆盖。 (2认同)

man*_*lds 5

要添加@Amber所说的内容,您应该可以:

STANDARDS=no git commit -m "committing"
Run Code Online (Sandbox Code Playgroud)

并具有适当的预提交钩子,该钩子将查看环境变量并做出决策。

当然有--no-verify,但是我想您不想跳过整个预提交:

-n-
不验证

该选项绕过了pre-commit和commit-msg挂钩。另请参见githooks(5)。