在 Git rebase 过程中查找分支名称

16

什么意思?

在交互式 rebase 过程中,有没有比解析 .git/rebase-merge/head-name 更好的方法来查找正在被 rebase 的分支名称?

细节

通常我使用 git rev-parse --abbrev-ref HEAD 来获取分支名称。但在 rebase 过程中,该分支处于分离头状态,rev-parse 返回 HEAD

所以现在我正在解析 .git/rebase-merge/head-name 文件(如果存在)以提取分支名称。是否有一种方法(瓷器或其他方式)可以获取此数据?

用法:

git checkout "the_branch_name_I_want"
git rebase -i "some_other_branch_sha_etc"
# mark commit for edit ...
git magic-command # I'd like to get back "the_branch_name_I_want"
git rebase --continue

为什么?

我为什么想要做这个呢?

我将关于分支的元数据储存起来,并在commit-msg钩子中获取它,以便将其附加到我的提交信息中。我希望在交互式rebase期间使用rewordedit来修改提交信息时它也能正常工作。

代码:

branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [ "$?" -ne 0 ]; then
    echo "not in a git repo!"
    exit 2
fi
if [ "$branch" = "HEAD" ]; then
    # check if we are in a rebase
    head_name_file="$(git rev-parse --git-dir)/rebase-merge/head-name"
    if [ -f "${head_name_file}" ]; then
        branch=$(cut -f3- -d/ $head_name_file)
    else
        # ignore DETACHED HEAD state.
        exit 1
    fi
fi
## do something with branch

如果你正在将一个分支重新基于另一个分支,那么在交互式环境中执行此操作是否有任何理由? - Makoto
1
git status(非 --porcelain)会告诉你正在进行 rebase,并在可用时显示分支名称。它从 rebase-merge/head-namerebase-apply/head-nameBISECT_START 中获取。这个 status 输出的格式没有文档说明,但与其使用 git status 读取相同的文件,最好还是阅读它,因为至少你只需要一个集中的地方而不是三个。 (顺便说一句,你应该使用 git rev-parse --git-dir 而不是假设 .git。) - torek
@torek 这很奇怪,它在 git status 的友好输出中可用,但在 --porcelain 中却不可用。此外,对于 --git-dir--show-toplevel + `/.git/',我给出了 ++。谢谢。 - spazm
@makoto:我正在交互式地重新设置特定的提交以编辑我的提交消息,以便在合并之前在我的(个人)功能分支上进行。 - spazm
我发现 git branch --edit-description 在分离头状态下无法使用。 - spazm
显示剩余2条评论
2个回答

7
git branch --list 命令虽然显示了分支名称(参见此答案以获取详细信息),但在脚本编写时并不实用,因为您需要解析输出。
我使用以下函数来获取分支名称(基于head-name文件):
rebasing-branch() {
    for location in rebase-merge rebase-apply; do
        path=$(git rev-parse --git-path ${location})
        if test -d ${path}; then
            revision=$(<${path}/head-name)
            echo ${revision##refs/heads/}
            return 0
        fi
    done
}

在常规或交互式变基过程中,它会显示分支名称。

4
在交互式变基期间,有没有比解析.git/rebase-merge/head-name更好的方法来找到正在被变基的分支名称?
请注意,从Git 2.18(2018年第二季度)开始,在中断的“rebase -i”期间,“git branch --list”现在允许用户区分正在重新定位分离的HEAD和正在重新定位正常分支的情况。
因此,您仍然需要解析,但命令本身的输出现在是有用的。

请查看由Eric Sunshine (sunshineco)于2018年4月3日提交的提交1f537be
请查看由Kaartic Sivaraam (sivaraam)于2018年4月3日提交的提交a236f90
(于2018年4月25日由Junio C Hamano -- gitster --合并至提交4cbaa6b)

branch --list: 在交互式变基一个分离的 HEAD 时打印有用信息

当交互式地变基 (rebase -i) 时,"git branch --list" 会打印一行指示正在被变基的当前分支。
当本地分支被检出时,这个功能可以正常工作。

当在一个分离的 HEAD 上启动变基时,这个功能就无法正常工作了。
当 "git branch --list" 尝试打印与交互式变基相关的信息时, 它尝试使用未初始化的变量来打印分支名称,并因此尝试打印“null 指针字符串”。
因此,它既没有提供有用的信息,还诱导了未定义的行为。

因此,在交互式变基一个分离的 HEAD 时,请打印变基开始的点。

查看测试


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