如何检查git分支是否具有跟踪分支?

den*_*hik 3 git bash

我正在为bash写一个小的git helper,我需要知道某个名称的分支是否具有跟踪分支。

更具体地说,问题是,如果git pull在没有跟踪分支的分支上运行,它将失败,并显示以下内容:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> foo
Run Code Online (Sandbox Code Playgroud)

git pull --quiet 也不会隐藏此消息。

我设法找到了这个有用的快捷方式:

git rev-parse --symbolic --abbrev-ref foo@{u}
Run Code Online (Sandbox Code Playgroud)

如果存在跟踪分支,它将完全满足我的需要,并输出以下内容:

origin/foo
Run Code Online (Sandbox Code Playgroud)

但是,如果分支没有跟踪分支,则输出如下:

fatal: No upstream configured for branch 'foo'
Run Code Online (Sandbox Code Playgroud)

除了它以非零状态存在并将其输出到stderr外,这还可以。

所以我基本上想做的是:

tracking_branch=$(git do-some-magick foo)
if [[ -n $tracking_branch ]]; then
    git pull
fi
Run Code Online (Sandbox Code Playgroud)

代替这个:

tracking_branch=$(git rev-parse --symbolic --abbrev-ref foo@{u} 2> /dev/null)
if [[ -n $tracking_branch ]]; then
    git pull
fi
Run Code Online (Sandbox Code Playgroud)

它实际上工作正常,但对我来说似乎不合适。还有其他方法吗?

rye*_*nus 5

您可以尝试以下方法来找到跟踪分支:

git config --get branch.foo.merge
Run Code Online (Sandbox Code Playgroud)

例子:

$ git config --get branch.master.merge
refs/heads/master

$ git config --get branch.foo.merge # <- nothing printed for non-tracked branch "foo"
Run Code Online (Sandbox Code Playgroud)

.git/config根据git pull的手册,有关跟踪分支的信息存储在特定于存储库中:

从git-branch [1] --track设置的当前分支的“远程”和“合并”配置中读取<repository>和<branch>的默认值。