我有一个 Git 预提交 Hook ,它阻止我提交到 master 除非被覆盖,以鼓励在分支上开发。
但是我想自动允许 merge 提交到 master。有没有办法从我的预提交 Hook 脚本中识别 merge 提交?脚本如下所示:
#!/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
已解决:对于任何寻求剪切和粘贴的人来说,这个钩子(Hook)脚本的工作版本是:
#!/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
最佳答案
我在其中添加了一些评论,但这里重要的是在 pre 提交 Hook 中,您要测试的提交尚不存在,因此您不能计算它的 parent 。
这是你得到的:
如果您正在使用
git commit --amend
来修改 merge 提交,预提交 Hook 将照常运行,但它不能没有真正检测到这种情况正在发生。新的提交将是一个 merge ,但你不知道。如果您使用常规的旧
git commit
创建非 merge 提交,文件MERGE_HEAD
将不存在于 git 目录中,并且您可以看出这不会创建 merge 提交。如果您正在使用
git commit
来完成冲突 merge ,文件MERGE_HEAD
将 存在,您可以告诉这将创建一个 merge 提交。如果您正在运行
git merge
并且它自己成功了,它会在不使用预提交 Hook 的情况下进行新的提交,因此您甚至不会在此处被调用。
因此,如果您愿意允许 git commit --amend
merge 失败,您可以接近您想要的结果:只需测试 $GIT_DIR/是否存在MERGE_HEAD
以查看这是否是正在完成冲突 merge 的 git commit
。 (使用 $GIT_DIR
是一个技巧,即使命令在 git 树之外运行也能使它工作。Git 设置 $GIT_DIR
以便 Hook git 命令将工作正常。)
关于git - 如何允许 git merge 提交掌握但防止非 merge 提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29229247/