解决合并冲突后如何绕过预提交挂钩?

时间:2020-04-15 17:25:00

标签: git husky git-husky lint-staged

TLDR:git rev-parse -q --verify MERGE_HEAD不在合并状态时会出错。在合并状态下,如何获得类似的错误消息?


问题:当我将master合并到分支中并且有冲突时,我必须手动更正它们,然后提交。但是在某些情况下,我有太多来自主服务器的更改,所以我宁愿跳过预提交钩子。

部分解决方案::我可以运行git commit --no-verify并合并所有内容,但这是因为我知道该标志。其他开发人员可能对此一无所知,因此(1)他们花了比所需时间更多的时间来等待预提交的钩子运行;(2)由于花费的时间太长,他们倾向于不太可能重新合并主服务器(假设)

几乎确定的解决方案::我找到了一种方法,可以使用git rev-parse -q --verify MERGE_HEAD来检测自己是否处于合并状态。处于合并状态时,它返回一个哈希值;而在非合并状态时,它会返回错误。但是我所需要的恰恰相反。当我处于合并状态时,我需要它来出错,因此我可以将其作为预提交钩子添加到我的所有钩子中。这会使它们在第一行中失败,然后不执行以下命令。

  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.js": [
      "git rev-parse -q --verify MERGE_HEAD",
      "eslint --max-warnings 0 --fix"
    ],
    "*.scss": [
      "git rev-parse -q --verify MERGE_HEAD",
      "stylelint 'app/**/*.scss'"
    ],
    "*.{js,json,yml,scss,md}": [
      "git rev-parse -q --verify MERGE_HEAD",
      "prettier --write"
    ],
    "*": [
      "bundle exec rubocop --auto-correct --force-exclusion"
    ]
  },

请注意,上述无效。为了使它起作用,我们所需要做的就是从git rev-parse -q --verify MERGE_HEAD反转效果,即,当我们处于合并状态时,它应该会出错。如何通过简单的命令执行此操作?

2 个答案:

答案 0 :(得分:1)

您是否考虑过否定初始命令的结果?例如

git rev-parse -q --verify MERGE_HEAD && false

如果您在合并的中间,则右侧为true,因此false得到评估,并且该命令以状态代码1退出。

答案 1 :(得分:1)

如果您不想在解决合并冲突后在预提交钩子上运行lint-staged脚本,则可以执行以下代码片段中的操作。我添加了--no-revs只是为了不显示不需要的输出

"husky": {
  "hooks": {
    "pre-commit": "git rev-parse -q --no-revs --verify MERGE_HEAD || lint-staged"
  }
},
相关问题