如何在自定义Git合并驱动程序中检索分支名称?

van*_*jan 8 git git-merge

我正在编写一个自定义合并驱动程序,需要知道它正在合并的分支的名称.我设法检索要合并到(目标)git symbolic-ref HEAD的分支的名称,以及从GITHEAD_<SHA>环境变量合并(源)的分支的名称.

# retrieve merged branch name from an env var GITHEAD_<sha>=<branchName> 
# we cannot use a sym ref of MERGE_HEAD, as it doesn't yet exist 
gitHead=$(env | grep GITHEAD) # e.g. GITHEAD_<sha>=release/1.43 
# cut out everything up to the last "=" sign 
source="${gitHead##*=}"

# retrieve base branch name from a sym ref of HEAD 
branch=$(git symbolic-ref HEAD) # e.g. refs/heads/master 
# cut out "refs/heads"
destination="${branch#refs/heads/}"

echo "Merging from $source into $destination"
Run Code Online (Sandbox Code Playgroud)

这是正确的做法吗?特别是,从环境变量中检索名称似乎很脆弱.请注意,此时MERGE_HEAD不存在,因此我不能使用与HEAD相同的方法.

tor*_*rek 1

是的,这是您在合并驱动程序中所能得到的最接近的结果。

合并策略通过查找每个参数从给定合并策略的参数中填充的GITHEAD_%s每个位置来获取正确的名称,每个“远程头”一个。%s有关详细信息,请参阅我对相关问题的回答。这没有在任何地方记录,它只是来自来源。不幸的是,当您开始使用合并驱动程序时,此信息已丢失:没有%指令可以检索这些名称,尽管可能有。(添加一些%指令应该很容易:只需增加字典的大小并添加适当的指令和strbuf对象即可。)

如果您正在处理普通的两个头和一个基合并,则只有一个GITHEAD_*变量,并且它是另一个头,但如果您正在处理章鱼合并,那么您就不走运了。