绕过预提交钩子进行合并提交

时间:2015-01-06 14:14:30

标签: git git-submodules githooks

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

  1. 修补程序分支(主/修补程序)
  2. git merge(或以一种不会在合并提交案例中崩溃的方式找到一种方法)
  3. 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'阅读:没有这样的文件或目录。

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

2 个答案:

答案 0 :(得分:14)

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

 git rev-parse -q --verify MERGE_HEAD

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

答案 1 :(得分:1)

如此related answer中所述,您可以测试是否存在$GIT_DIR/MERGE_HEAD以检测合并提交:

  

这是你得到的:

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

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

  •   
  • 如果您正在使用git commi t来完成冲突合并,则文件MERGE_HEAD将存在,您可以告诉我这是   创建合并提交。

  •   
  • 如果您正在运行git merge并且它自己成功,则会在不使用预提交挂钩的情况下进行新提交,因此您甚至无法获得   在这里调用。

  •   
     

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