在git rebase

时间:2015-12-10 22:45:47

标签: git git-branch git-rebase

什么?

有没有办法在交互式rebase期间找到正在重新分支的分支的名称,这比解析.git/rebase-merge/head-name更好?

详细

通常我使用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

2 个答案:

答案 0 :(得分:2)

  

有没有办法在交互式rebase期间找到正在重新分支的分支的名称,这比解析.git / rebase-merge / head-name更好?

请注意,使用Git 2.18(2018年第二季度),在“git branch --list”中断期间,“rebase -i”现在可以让用户区分分离的HEAD被重新定位的情况和正常情况分支正在重新定位。

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

commit 1f537beEric Sunshine (sunshineco)(2018年4月3日) commit a236f90Kaartic Sivaraam (sivaraam)(2018年4月3日) Junio C Hamano -- gitster --合并于commit 4cbaa6b,2018年4月25日)

  

branch --list:在交互式重新定位分离的HEAD

时打印有用的信息      

以交互方式(rebase -i)进行折扣时,会打印“git branch --list”   表示当前分支正在重新定位的一行   当本地分支启动交互式rebase时,这很有效   检查出来。

     

当在分离的HEAD上启动rebase时,这不能很好地发挥作用   当“git branch --list”尝试打印相关信息时   在这种情况下,它会尝试打印名称   使用未初始化的变量的分支,因此尝试   打印“null pointer string”   因此,它不会提供有用的信息,同时也会导致不确定的行为。

     

因此,打印交互时启动rebase的点   重新定位一个独立的HEAD。

See the test

答案 1 :(得分:2)

尽管git branch --list显示了一个分支名称(有关详细信息,请参见this answer),但是在脚本编写过程中它并没有用,因为您需要解析输出。

我使用以下函数来获取分支名称(基于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
}

它显示了在定期或交互式重新定位期间的分支名称。