执行`git merge`命令时是否有绕过合并后Git钩子的方法?

21

我已经配置了合并后的挂钩,以便与另一个版本控制系统(半手动)集成。 但是有时我想避免运行挂钩,是否有一种方法可以绕过git merge的挂钩?

我知道对于git commit,有一个--no-verify命令行参数。那种解决方案非常适合我的用例,但似乎--no-verifygit commit命令中不起作用。


你似乎在使用 --no-verify 方面走上了正确的轨道,请参考这篇 Stack Overflow 帖子 - Tim Biegeleisen
5个回答

17

您可以通过以下方式暂时禁用Git钩子:

$ git config core.hooksPath # to see the current value
$ git config core.hooksPath '/dev/null'
$ git merge --continue
$ git config core.hooksPath '/value/you/had/before'

改编自这个有用的答案。


2
谢谢!在 merge --continue 之后,我不得不使用 git config --unset core.hooksPath,因为我的 hooksPath 最初返回了空值。你可以将这个加入到你的答案中。 - Ramon Dias

17

一个简单的方法(无需更改配置文件)适用于我:

  1. git merge main
  2. 解决合并冲突(如果有)
  3. git add .
  4. git commit --no-verify
  5. git push

这只是一个示例,您可以明确指定要添加哪些文件,并添加提交消息。当尝试 git merge --continue 时,我遇到了与 OP 相同的问题。

git 版本:2.35.1


1
这就是我们都来寻找的答案。 - undefined

14

对于那些因为 git merge --no-verify --continue 无法共同工作而来到这里的人 - 您可以暂时禁用挂钩以进行合并 - 例如,对于我的当前React项目,我只是从我的 package.json 中删除了这一部分 - 因为文件未暂存,它不会进入合并提交。

  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,ts,tsx}": [
      "eslint --fix --rule '@typescript-eslint/no-non-null-assertion: error'",
      "prettier --write"
    ],
    "*.css": [
      "stylelint --fix",
      "prettier --write"
    ],
    "*.{json,yml,md,eslintrc,stylelintrc,babelrc}": [
      "prettier --write"
    ]
  },

如果有人在使用 pre-commit,我必须启用无害的钩子,否则 pre-commit 会抱怨无效,并且合并将失败。 - Mattwmaster58

11

没有标志可以禁用运行后合并挂钩,但是您可以轻松地设计自己的后合并挂钩(由于它在您自己的存储库中,因此您完全控制),以遵守环境变量。例如,一个shell脚本可能会开始:

#! /bin/sh
warn() {
    echo "warning: $1" 1>&2
}
case ${SKIP_POST_MERGE_HOOK:-no} in
yes) exit 0;;
no) ;;
*) warn "mystery value ${SKIP_POST_MERGE_HOOK} for SKIP_POST_MERGE_HOOK";;
esac
... rest of code as usual ...

如果您现在想要运行git merge,但要绕过挂钩(或运行类似于为您运行git merge的便捷脚本 git pull),只需在此期间设置SKIP_POST_MERGE_HOOK=yes

$ SKIP_POST_MERGE_HOOK=yes git merge ...

1

我使用了GIT_REFLOG_ACTION环境变量来实现这个技巧。

当使用git pull命令时,你会发现在git hook中GIT_REFLOG_ACTION=pull

因此,你可以像下面这样做:

# if git pull, abort
if [[ $GIT_REFLOG_ACTION == "pull" ]]; then
  echo "git pull detected, aborting"
  exit 0
fi

我希望你能帮到我!

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