【问题标题】:bypass pre-commit hook for merge commits绕过合并提交的预提交钩子
【发布时间】:2015-03-04 05:30:19
【问题描述】:

我设置了一些 git 钩子来在预提交时运行一些 gulp 命令。我基本上运行jshint/plato。我基本上想在两种情况下绕过这些:

  1. 修补程序分支(主/修补程序)
  2. git 合并(或找到一种在合并提交情况下不会崩溃的方法)

plato gulp 命令对源代码运行分析并生成一个 /reports/ 目录,该目录随时间跟踪复杂性。如果我们在修补程序分支上执行此操作,则在将它们合并回开发时会导致合并冲突。简单的钩子就说到这里了:

#!/bin/sh

if git diff --cached --name-only --diff-filter=ACM | grep '.js$' >/dev/null 2>&1
then
  git stash -q --keep-index
  ./node_modules/.bin/gulp jshint
  RESULT=$?
  git stash pop -q
  [ $RESULT -ne 0 ] && exit 1
  git stash -q --keep-index
  ./node_modules/.bin/gulp plato
  git add report/
  git stash pop -q
fi

exit 0

现在的问题是,如果我在“报告”上有合并冲突,我解决了合并 All conflicts fixed but you are still merging. 然后提交它再次运行分析并暂存提交,当它提交时会引发错误:

/Users/Nix/work/project/.git/modules/somesubmodule/MERGE_HEAD' 供阅读:没有这样的文件或目录。

目录确实存在但没有合并头...

【问题讨论】:

    标签: git git-submodules githooks


    【解决方案1】:

    所以我刚刚找到了一个我认为可以用来检测“merge_head”的命令

     git rev-parse -q --verify MERGE_HEAD
    

    如果 rev-parse 返回一个哈希值,这意味着我们当前处于合并状态。我可以用它来绕过这个逻辑。但将等待更有经验的人提供更好的建议。

    【讨论】:

    • 为我工作。谢谢!
    • 如果你正在变基,你可以用下面的方法做同样的事情:git rev-parse -q --verify REBASE_HEAD
    • 很抱歉这个新手问题,但我们怎么会产生完全相反的效果呢?即,如果我们想在我们处于合并状态时出错。
    • @FlavioWuensche 用于跳过合并:(git rev-parse -q --verify MERGE_HEAD) || (skip_this_if_merging)。在合并时运行:(git rev-parse -q --verify MERGE_HEAD) && (only_run_this_if_merging)
    • 奇怪,但在 rebase 完成后,git rev-parse -q --verify REBASE_HEAD 评估为 true 事件。我试过(git rev-parse -q --verify MERGE_HEAD || git rev-parse -q --verify REBASE_HEAD) || (skip_this_if_merging_or_rebasing)
    【解决方案2】:

    正如related answer 中提到的,您可以测试$GIT_DIR/MERGE_HEAD 的存在以检测合并提交:

    这是你得到的:

    • 如果您使用git commit --amend 修改合并提交,预提交挂钩将照常运行,但它无法真正检测到这一点 正在发生。新的提交将是一个合并,但你无法判断。

    • 如果您使用常规的旧 git commit 创建非合并提交,则文件 MERGE_HEAD 将不存在于 git 目录中,并且 你可以看出这不会创建合并提交。

    • 如果您使用 git commit 完成冲突合并,则文件 MERGE_HEAD 将存在,您可以看出这将 创建一个合并提交。

    • 如果你正在运行 git merge 并且它自己成功了,它会在不使用 pre-commit 钩子的情况下进行新的提交,所以你甚至不会得到 在这里调用。

    因此,如果您愿意允许 git commit --amend 合并到 失火,你可以接近你想要的:只需测试 $GIT_DIR/MERGE_HEAD 的存在,看看这是不是 git commit 正在完成一个冲突的合并。 ($GIT_DIR的使用是个技巧 即使命令在 git 树之外运行,也要使这项工作正常进行。 Git 设置 $GIT_DIR 以便挂钩 git 命令可以正常工作。)

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2013-12-15
      • 2017-02-08
      • 2016-09-02
      • 2022-01-07
      • 1970-01-01
      • 2015-12-10
      • 2017-12-10
      相关资源
      最近更新 更多