【问题标题】:Get source branch name in commit-msg hook of merge commit在合并提交的 commit-msg 钩子中获取源分支名称
【发布时间】:2015-04-30 13:57:15
【问题描述】:

在合并提交的 commit-msg 挂钩中,如何获取合并的直接源分支的分支名称?我可以用类似的东西获得目标分支

git rev-parse --abbrev-ref HEAD

但是 HEAD 和 HEAD^ 都指向目标分支。有没有办法以编程方式确定来源?我正在为钩子使用 bash 脚本。

默认的合并提交消息包含以下文本:

将分支“源分支”合并到目标分支中

因此,commit-msg 钩子可以直接从消息中获取名称,但不能保证用户没有编辑它。如果有更万无一失的方法,我更喜欢。

编辑:啊,不幸的是我也没有意识到 commit-msg 实际上甚至没有在合并提交上运行!所以无论如何我都必须找到一种不同的方式来做我想做的事。

【问题讨论】:

  • 我不确定 git 何时删除 MERGE_HEAD 引用。进行合并时测试它是否可用于您的钩子

标签: git


【解决方案1】:

这将为您提供正在合并的提交:

git rev-parse MERGE_HEAD

我认为除了使用以下命令猜测之外,没有其他方法可以找到分支名称:

git for-each-ref | grep ^$(git rev-parse MERGE_HEAD)

(找到所有指向你正在合并的提交的分支)

注意,被合并的提交不一定必须是一个分支,也可以像git merge deadbeef一样直接合并一个提交。

在章鱼合并的情况下,同时合并了多个提交,并且MERGE_HEAD不存在。

如果您要从合并消息中提取它,那么使用.git/MERGE_MSG.git/COMMIT_EDITMSG 更安全,因为它不太可能被手动编辑。

消息由git merge 生成,因此可以从git merge 的参数中访问分支名称,但这似乎没有存储在磁盘上。

【讨论】:

  • 谢谢,MERGE_HEAD 几乎是我的问题的答案,但好的一点是理论上它可以属于多个分支。
【解决方案2】:

但不能保证用户没有编辑它

imvho 你应该在用户有机会编辑它之后使用合并提交摘要行。

我编辑主​​题行是有充分理由的。所有分支名称都是 repo-local。有时你是从同事那里拉出来的,有时你意识到你在创建分支时打错了,或者你是从一个结果很好的 wip 发布的,还有很多方法可以到达那里。

如果您担心入站提交不符合您自己的存储库之一的标准,请在其预接收中审查入站提交。无论如何,如果不这样做,任何 dvcs 都无法确定。

#!/bin/sh
rc=0
existing=$(git for-each-ref --format='%(object)' refs/heads refs/tags);
validmergesubject='Merge (branch|tag) '\''[^ ]*'\'' (of|into) .*'
while read old new ref; do
    while read commit Subject; do
        if [[ ! $Subject =~ $validmergesubject ]]; then
            echo Merge $commit in $ref history has invalid summary line \"$Subject\"
            rc=1;
        fi;
    done  >&2 <<EOD
$(git log --merges --pretty='%H %s' $new --not $existing)
EOD
done
exit $rc

【讨论】:

  • 这也是一个好点,用户可能想要更改名称。在我们的特殊情况下,这不一定是一个问题,因为我们只是使用分支名称来填充用户在提交消息中输入的宏,所以他们可以简单地改变他们在那里输入的内容,但无论如何都是好的。
猜你喜欢
  • 2017-03-16
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多