如何允许git merge commit to master但阻止非合并提交?

时间:2015-03-24 09:40:56

标签: git githooks

我有一个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

1 个答案:

答案 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命令可以正常工作。)