我有一个Git预提交钩子,除非被覆盖,否则我无法提交到master,以鼓励在分支上进行开发。
但是我想自动允许合并提交来掌握。有没有办法从我的预提交钩子脚本中识别合并提交?脚本如下所示:
#!/bin/bash
BRANCH=`git branch --color=never| grep '^*'|cut -c3-`
if [ "${BRANCH}D" == "masterD" -a "${GIT_COMMIT_TO_MASTER}D" != "trueD" ]
then
echo "Commit directly to master is discouraged."
echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit."
exit 1
fi
已解决:对于任何寻找剪切和粘贴的人来说,此挂钩脚本的工作版本是:
#!/bin/bash
BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "${BRANCH}" == "master" -a "${GIT_COMMIT_TO_MASTER}" != "true" ]
then
if [ -e "${GIT_DIR}/MERGE_MODE" ]
then
echo "Merge to master is allowed."
exit 0
else
echo "Commit directly to master is discouraged."
echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit."
exit 1
fi
fi
答案 0 :(得分:7)
我添加了一些注释,但重要的一点是,在 pre -commit挂钩中,您即将测试的提交尚不存在,因此您可以&# 39;计算其父母。
这是你得到的:
如果您正在使用git commit --amend
来修改合并提交,那么预提交挂钩会像往常一样运行,但它无法真正检测到这种情况正在发生。新提交将是合并,但您无法说明。
如果您使用常规旧git commit
创建非合并提交,则git目录中不存在文件MERGE_HEAD
,您可以告诉它是不打算创建合并提交。
如果您正在使用git commit
完成有冲突的合并,则文件MERGE_HEAD
将存在,您可以告诉我这是创建合并提交。
如果您正在运行git merge
并且它自己成功,则会在不使用预提交挂钩的情况下进行新提交,因此您甚至不会在此处调用它。
因此,如果您愿意允许git commit --amend
合并失败,您可以接近您想要的内容:只测试$GIT_DIR/MERGE_HEAD
是否存在,看看是否存在正在完成冲突合并的git commit
。 (即使命令是在git树之外运行的,使用$GIT_DIR
也是一种技巧.Git设置$GIT_DIR
以便挂机git命令可以正常工作。)