有没有办法在执行`git merge`命令时绕过合并后的git钩子

Tim*_*Tim 6 git merge hook githooks

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

我知道有--no-verify命令行参数git commit。这种解决方案非常适合我的用例,但似乎 --no-verify不适用于git commit命令。

小智 22

对我有用的简单方法(无需更改配置文件)是:

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

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

git版本:2.35.1


小智 19

您可以通过执行以下操作暂时禁用 git hooks:

$ 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'
Run Code Online (Sandbox Code Playgroud)

改编自这个有用的答案。

  • 谢谢你!在“merge --continue”之后,我使用了“git config --unset core.hooksPath”,因为我的“hooksPath”首先什么也没返回。您可以将其添加到您的答案中。 (3认同)

god*_*rry 15

对于那些因为不能一起工作而来到这里的人git merge --no-verify --continue- 您可以暂时禁用合并的钩子 - 例如,对于我当前的反应项目,我刚刚从我的项目中删除了这部分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"
    ]
  },
Run Code Online (Sandbox Code Playgroud)


tor*_*rek 8

没有禁止运行合并后挂钩的标志,但您可以轻松地装配自己的合并后挂钩(您完全控制它,因为它在您自己的存储库中)以服从环境变量。例如,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 ...
Run Code Online (Sandbox Code Playgroud)

现在,如果您想运行git merge但绕过钩子(或运行类似为您git pull运行的便利脚本之类的东西git merge),只需设置SKIP_POST_MERGE_HOOK=yes持续时间:

$ SKIP_POST_MERGE_HOOK=yes git merge ...
Run Code Online (Sandbox Code Playgroud)