在 git rebase 期间查找分支名称

问题描述 投票:0回答:2

什么?

有没有办法在交互式变基过程中找到正在变基的分支的名称,这比解析更好

.git/rebase-merge/head-name

详情

通常我使用

git rev-parse --abbrev-ref HEAD
来获取分支名称。但在变基期间,分支处于分离头状态,并且 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
挂钩中以附加到我的提交消息中。我希望在交互式变基期间
reword
ing 或
edit
ing 我的提交消息时可以使用此功能。

代码:

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
git git-branch git-rebase
2个回答
8
投票

虽然

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
}

它在常规或交互式变基期间显示分支名称。


5
投票

有没有办法在交互式变基过程中找到正在变基的分支的名称,这比解析 .git/rebase-merge/head-name 更好?

请注意,在 Git 2.18(2018 年第 2 季度)中,中断的“

git branch --list
”期间的“
rebase -i
”现在可以让用户区分分离的
HEAD
正在重新设置基址和正常分支正在重新设置基址的情况。

所以你仍然需要解析,但是命令本身的输出现在是有用的。

参见commit 1f537be(2018 年 4 月 3 日),作者:Eric Sunshine (

sunshineco
)
请参阅 Kaartic Sivaraam (sivaraam)
commit a236f90
(2018 年 4 月 3 日)。
(由 Junio C Hamano --
gitster
--
合并于 commit 4cbaa6b,2018 年 4 月 25 日)

branch --list
:打印有用的信息,同时交互式地重新定位分离的 HEAD

交互变基时 (

rebase -i
),“
git branch --list
”会打印一行,指示当前分支正在变基。
当签出本地分支时启动交互式变基时,这很有效。

当在分离的 HEAD 上启动变基时,这效果不佳。
当“

git branch --list
”尝试打印相关信息时 在这种情况下,交互式变基会尝试打印名称 使用未初始化变量的分支,因此尝试 打印“
null pointer string
”。
因此,它无法提供有用的信息,同时还会引发未定义的行为。

因此,当交互式变基分离的 HEAD 时,打印开始变基的点。

查看测试


对于某些事情,

git log
是比文档更好的参考。 (我想知道为什么他们不为
--exec
命令设置环境变量。)

确实,

git log
确实可以提供有价值的见解,特别是对于了解 Git 中的功能演变和错误修复。通过检查提交消息和通常包含的详细解释,您可以更深入地了解更改背后的上下文和推理,这在官方文档中可能并不明显。这对于高级用户或那些与 Git 紧密集成的开发工具特别有用。

--exec
命令建议一个环境变量表明了更广泛的需求,即在各种 Git 操作中(例如在 rebase 期间)随时可用信息。
目前,Git 没有设置在 rebase 期间公开当前分支名称的特定环境变量,以便与交互式 rebase 中的
--exec
命令一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.