我有一个Git预提交钩子,除非被覆盖,否则我无法承诺掌握,以鼓励在分支上进行开发.
但是,我想自动允许合并提交掌握.有没有办法从我的预提交钩子脚本中识别合并提交?该脚本如下所示:
#!/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
Run Code Online (Sandbox Code Playgroud)
求助:对于任何寻找剪切和粘贴的人来说,这个钩子脚本的工作版本是:
#!/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
Run Code Online (Sandbox Code Playgroud)
我在其中添加了一些注释,但重要的一点是,在预先提交的挂钩中,您即将要测试的提交尚不存在,因此您无法计算其父项.
这是你得到的:
如果您使用git commit --amend到修改合并提交,预提交钩子照常运行,但它不能真正发现这种情况的发生.新提交将是合并,但你无法分辨.
如果您使用常规old git commit来创建非合并提交,则该文件MERGE_HEAD将不存在于git目录中,您可以告诉它不会创建合并提交.
如果您正在使用git commit完成冲突的合并,则该文件MERGE_HEAD 将存在,您可以告诉它将创建合并提交.
如果你正在运行git merge并且它自己成功,它会在不使用预提交钩子的情况下进行新的提交,因此你甚至不会在这里调用它.
因此,如果你愿意允许git commit --amend合并失败,你可以接近你想要的东西:只测试存在,$GIT_DIR/MERGE_HEAD看看这是否是一个git commit完成冲突的合并.($GIT_DIR即使命令在git树外部运行,使用也是一种技巧.Git设置$GIT_DIR使得挂机git命令可以正常工作.)
| 归档时间: |
|
| 查看次数: |
1474 次 |
| 最近记录: |