git - 如何允许 git merge 提交掌握但防止非 merge 提交?

标签 git githooks

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

相关文章:

git - 使用裸存储库 Hook 将服务器恢复到过去的提交

GitExtensions 编辑器的 Windows .gitconfig 设置

git - git-强制更新。发生了什么?

bash - 单个命令中的多个 git 命令按照编译器遇到的顺序执行

git - 如果分支提交了具有特定条件的消息,则防止 merge 到 master

git - post-receive hook -- 如果传入文件类型为 *.cgi,则将权限设置为 755

git - 如何将一个本地 git 仓库推送到两个不同的 github 帐户

git - Repo (+git) 的增值是什么?

git - 在预提交 Hook 中,查找正在创建的提交的父级的哈希值

git - 如何在 TFS 中应用服务器端 Hook - Git 存储库