我设置了一些git钩子来在预提交时运行一些gulp
命令。我基本上运行jshint
/ plato
。我基本上想在两种情况下绕过这些:
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'阅读:没有这样的文件或目录。
目录确实存在,但没有合并头...
答案 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命令可以正常工作。)