【发布时间】:2015-05-27 13:32:48
【问题描述】:
我有一个 Git 预提交挂钩,除非被覆盖,否则我无法提交到 master,以鼓励在分支上进行开发。
但是我想自动允许合并提交到 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
【问题讨论】:
-
建议:更稳健的获取当前分支的方法是
branch=$(git rev-parse --abbrev-ref HEAD)。 -
谢谢,我会试试的。
-
@Jubobs:通常最好使用
git symbolic-ref HEAD。如果需要,可以添加-q— 在这种情况下,您会想要退出 0,因此在这种特定 情况下,使用git rev-parse可能会更好:对于分离的头部你只会得到HEAD,这与master不匹配。 -
与问题无关,但您的
D就足够了,完全是多余的。仅当您不使用引号时才需要它们,并且它们会降低可读性,因此请删除它们。 -
还值得注意的是,'--no-verify' 标志将绕过预提交挂钩。我建议删除“GIT_COMMIT_TO_MASTER”部分以支持逐个覆盖,因为在覆盖后很容易忘记将“GIT_COMMIT_TO_MASTER”设置回 false。