在合并提交的commit-msg钩子中获取源分支名称

4
在合并提交的commit-msg钩子中,如何获取合并操作的直接源分支的分支名称?我可以使用类似以下的方式获取目标分支:
git rev-parse --abbrev-ref HEAD

但HEAD和HEAD^都指向目标分支。有没有办法以编程方式确定源?我正在使用钩子的bash脚本。
默认的合并提交消息包含此文本:
合并分支“source-branch”到目标分支
因此,commit-msg钩子可以从消息中直接获取名称,但不能保证用户未编辑它。如果有更可靠的方法,我更喜欢使用它。
编辑:啊,不幸的是,我也没有意识到commit-msg实际上甚至不在合并提交上运行!所以无论如何,我必须找到另一种方法来做我想做的事情。

我不确定 git 何时删除 MERGE_HEAD 引用。如果您执行合并操作时可以使用钩子,请测试它是否可用。 - Konstantin
2个回答

2
这将给你合并的提交记录:
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基本上就是我问题的答案,但理论上它可能属于多个分支。 - Nathan Stretch
1
我收到了错误信息:“fatal: ambiguous argument 'MERGE_HEAD': unknown revision or path not in the working tree.” - Black Mantha

1

但无法保证用户没有编辑过它

在我看来,当用户有机会编辑后,您应该使用合并提交摘要行。

我已经出于很好的原因编辑了主题行。所有分支名称都是特定于存储库的。有时您正在从同事那里拉取,有时您意识到在创建分支时输错了,或者您正在从工作中发布一个好的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

这也是一个很好的观点,用户可能想要更改名称。在我们的特定情况下,这并不一定是问题,因为我们只是使用分支名称填充到用户输入提交消息中的宏中,所以他们可以简单地更改他们在那里输入的内容,但无论如何都是个好观点。 - Nathan Stretch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接