指定在 git commit --no-verify 上跳过哪个钩子

Posted

技术标签:

【中文标题】指定在 git commit --no-verify 上跳过哪个钩子【英文标题】:specify which hook to skip on git commit --no-verify 【发布时间】:2018-09-14 14:30:31 【问题描述】:

如果有办法在使用--no-verify 时准确指定要跳过哪个git-hook?或者除了--no-verify 之外还有其他标志可以实现这一点吗?也许只是一个只跳过pre-commit的标志?

我有两个经常使用的钩子,pre-commitcommit-msgpre-commit 运行我的 linting、流检查和一些单元测试。 commit-msg 将我的分支名称附加到提交消息的末尾。

有时我想--no-verify pre-commit 但仍然希望commit-msg 运行。

似乎有很多类似这样的 SO 帖子,但没有什么比使用 --no-verify 选择性跳过更好的了。

【问题讨论】:

【参考方案1】:

跳过

如果您能够修改挂钩,则可以为每个挂钩添加一个切换开关。

来自pre-commit.sample 的特定验证切换示例:

# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --bool hooks.allownonascii)

因此,要启用切换整个 pre-commit hook,可以将其添加到 它的开头:

enabled="$(git config --bool hooks.pre-commit.enabled)"

if test "$enabled" != true
then
    echo 'Warning: Skipping pre-commit hook...'
    exit
fi

使用示例:

git -c hook.pre-commit.enabled=false commit

别名

注意:两种类型的别名break制表符补全

git alias 可以简化这一点:

git config --global alias.noprecommit \
  '!git -c hook.pre-commit.enabled=false'

这样,您可以通过以下调用提交并跳过 hook

git noprecommit commit

您也可以使用shell alias(例如:~/.bashrc):

alias gitnoprecommit='git -c hook.pre-commit.enabled=false'

使用示例:

gitnoprecommit commit

【讨论】:

例如git -c hooks.pre-commit.enabled=false cherry-pick --continue。您需要将默认值添加到 git config(一次性),如下所示:git config hooks.pre-commit.enabled true【参考方案2】:

如果您想提交并绕过单个预提交挂钩,请使用

SKIP=hook_name git commit -m "commit_message"

SKIP 环境变量是一个逗号分隔的钩子 ID 列表。这允许您跳过单个钩子而不是 --no-verifying 整个提交。

SKIP=flake8,mypy git commit -m "commit_message"

【讨论】:

以上是关于指定在 git commit --no-verify 上跳过哪个钩子的主要内容,如果未能解决你的问题,请参考以下文章

git回滚到指定commit

git合并分支上指定的commit

git合并指定分支的commit到主干上

Git回滚到指定的commit

Git合并指定文件到其他分支

Git合并指定文件到其他分支