如何防止 interactive-rebase 在提交时运行验证挂钩?

如何防止 interactive-rebase 在提交时运行验证挂钩?

我有一系列提交未通过与它们一起提交的测试。我需要在这些提交之间进行交互式变基;但钩子失败了,导致每次提交都搞砸了,迫使我手动执行git commit -n每个步骤。

有没有办法实现自动化?git rebase --interactive --no-verify没有达到我期望的效果。

答案1

我偶然发现了同样的问题,但我发现的唯一答案是需要修改钩子本身。

这里作者建议使用分支名称来过滤这种情况:

#!/bin/bash
BRANCH_NAME=$(git branch | grep '*' | sed 's/* //') 

if [[ $BRANCH_NAME != *"no branch"* ]]
then
  # your regularly scheduled hook
fi

我稍微改变了一下条件,因为我的 git 输出看起来像这样(no branch, rebasing some-branch-name)。它不能解决我的具体情况,但也许有人会发现这个问题并在将来使用这种方法。

答案2

这是另一个非常快速且非侵入性的解决方法,它不需要修改您现有的钩子:

git config core.hooksPath .no-hooks

完成后,不要忘记恢复钩子。如果您使用的是全局默认钩子路径,$GIT_DIR/hooks那么您可以恢复此覆盖:

git config --unset core.hooksPath

或者如果你使用类似沙哑那么你需要:

git config core.hooksPath .husky

答案3

我喜欢这个解决方案https://blog.swwomm.com/2018/06/skip-pre-commit-hook-on-git-rebase-or.html

将其添加到预提交挂钩脚本中:

if [ "$NO_VERIFY" ]; then
    echo 'pre-commit hook skipped' 1>&2
    exit 0
fi

然后NO_VERIFY在运行交互式变基时更新:

NO_VERIFY=1 git rebase -i master # or `git merge some-branch` or whatever

答案4

变化@s6mike 给出的答案

观察到钩子上下文中已经有一些 GIT 环境变量,因此对于我的情况来说,当想要避免明确使用钩子来重写提交而不必设置新的环境变量时

if [[ "${GIT_REFLOG_ACTION}" =~ "rebase".*"reword" ]]; then
    exit 0
fi

相关内容