3

TLDR:git rev-parse -q --verify MERGE_HEAD不处于合并状态时出错。当我们处于合并状态时,如何获得类似的命令会出错?


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

部分解决方案:我可以运行git commit --no-verify并合并,但那是因为我知道标志。其他开发人员可能不知道,因此(1)他们花费了比需要更多的时间等待预提交挂钩运行和(2)因为它可能需要太长时间,他们往往不太可能重新合并 master(假设) .

几乎确定的解决方案:我找到了一种方法来检测我是否处于合并状态,方法是使用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,即,当我们处于合并状态时它应该出错。我怎样才能在一个简单的命令中做到这一点?

4

2 回答 2

2

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

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

如果您在合并中间,则右侧为 true,因此false会被评估并且命令以 status code 退出1

于 2020-04-15T22:36:07.917 回答
2

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

"husky": {
  "hooks": {
    "pre-commit": "git rev-parse -q --no-revs --verify MERGE_HEAD || lint-staged"
  }
},
于 2020-10-29T06:41:55.380 回答