【问题标题】:How can I allow git merge commits to master but prevent non-merge commits?如何允许 git merge 提交掌握但防止非合并提交?
【发布时间】: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。

标签: git githooks


【解决方案1】:

我放了几个 cmets,但这里重要的是,在 pre-commit 钩子中,你要测试的提交还不存在,所以你不能数它的父母。

这是你得到的:

  • 如果您使用git commit --amend修改合并提交,预提交挂钩将照常运行,但它无法真正检测到这种情况正在发生。新的提交将是一个合并,但你无法判断。

  • 1234563提交。
  • 如果您使用git commit 完成冲突合并,则文件MERGE_HEAD 存在,您可以看出这将创建一个合并提交。

  • 如果您正在运行 git merge 并且它自己成功,它会在不使用 pre-commit 挂钩的情况下进行新的提交,因此您甚至不会在这里被调用。

    李>

因此,如果您愿意允许 git commit --amend 合并失败,您可以接近您想要的:只需测试 $GIT_DIR/MERGE_HEAD 的存在,看看这是否是一个正在完成的 git commit关闭冲突的合并。 (使用$GIT_DIR 是一个技巧,即使命令在 git 树之外运行也是如此。Git 设置 $GIT_DIR 以便挂钩 git 命令可以正常工作。)

【讨论】:

  • 这看起来很有希望。我很高兴git commit --amend 需要覆盖,所以检查${GIT_DIR/MERGE_HEAD} 正是我正在寻找的。我会测试,如果我没有遇到任何问题,我会接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2012-11-09
相关资源
最近更新 更多