在git rebase期间找到分支名称

spa*_*azm 7 git git-rebase git-branch

什么?

有没有一种方法可以在交互式rebase期间找到被重新分支的名称,这比解析要好.git/rebase-merge/head-name

细节

通常我git rev-parse --abbrev-ref HEAD用来获取分支名称。但是在重新设置基准期间,分支处于独立的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
Run Code Online (Sandbox Code Playgroud)

为什么?

我为什么要这样做?

我存储有关分支的元数据,并将其提取到我的commit-msg钩子中以附加到提交消息中。我希望在交互式重定基础期间reword阅读或edit阅读我的提交消息时可以使用此功能。

码:

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
Run Code Online (Sandbox Code Playgroud)

Dmy*_*iuk 5

尽管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
}
Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 4

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

请注意,在 Git 2.18(2018 年第 2 季度)中,“ git branch --list”在中断的“ rebase -i”期间现在可以让用户区分分离分支HEAD正在重新建立基础和普通分支正在重新建立基础的情况。

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

请参阅Eric Sunshine ( )的提交 1f537be(2018 年 4 月 3 日)。 请参阅Kaartic Sivaraam ( )提交的 a236f90(2018 年 4 月 3 日)。(由Junio C Hamano 合并 -- --提交 4cbaa6b中,2018 年 4 月 25 日)sunshineco
sivaraam
gitster

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

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

当在分离的 HEAD 上启动变基时,这不能很好地发挥作用。
在这种情况下,当“ git branch --list”尝试打印与交互式变基相关的信息时,它会尝试使用未初始化的变量打印分支的名称,从而尝试打印“ null pointer string”。
因此,它无法提供有用的信息,同时还会引发未定义的行为。

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

看测试