1

如何获取有关特定本地 Git 分支的跟踪信息(即远程和分支名称),最好是在一个命令中?似乎有很多方法可以做到这一点,例如

git rev-parse --abbrev-ref --symbolic-full-name branch_name@{upstream}

但是,它以 形式返回上游'origin/branch_name',这使得很难找出单独的部分(例如,当远程或分支名称包含时'/')。是否有更可靠的解决方案,最好使用单个 Git 命令?

4

2 回答 2

1

答案中的@RomainValeri建议使用此命令来显示跟踪信息。

git for-each-ref --format="%(upstream:short)" refs/heads/<yourBranch>

但是,如果你想摆脱斜线,那么你可以这样做

git for-each-ref --format="%(upstream:remotename) %(upstream:lstrip=-1)"  \ 
# Insert your separator here                     ^
refs/heads/<yourBranch>

git-docs

上游的

本地 ref 的名称,可以认为是显示的 ref 的“上游”。尊重 :short、:lstrip和 :rstrip 的方式与上面的 refname 相同...

对于任何远程跟踪分支 %(upstream)、%(upstream:remotename)和 %(upstream:remoteref) 分别指远程的名称和跟踪的远程 ref 的名称。换句话说,远程跟踪分支可以通过使用 refspec %(upstream:remoteref):%(upstream) 从 %(upstream:remotename) 获取来显式地单独更新。

更多关于lstrip

如果添加了 lstrip=<N>(rstrip=<N>),则从 refname 的前(后)剥离 <N> 斜线分隔的路径组件(例如 %(refname:lstrip=2) 变成 refs/tags/foo变成 foo 和 %(refname:rstrip=2) 将 refs/tags/foo 变成 refs)。如果 <N> 是负数,则从指定端剥离尽可能多的路径组件以留下 -<N> 路径组件(例如 %(refname:lstrip=-2) 将 refs/tags/foo 转换为 tags/foo和%(refname:rstrip=-1) 将 refs/tags/foo 转换为 refs)。当 ref 没有足够的分量时,如果用正的 <N> 剥离,结果会变成一个空字符串,如果用负的 <N> 剥离,结果会变成完整的 refname。两者都不是错误。


一些例子 :

  • 格式 :"%(upstream:remotename):%(upstream:lstrip=-1)"

    输出 : <remote-name>:<branch-name>

  • 格式 :"%(upstream:remotename) %(upstream:lstrip=-1)"

    输出 : <remote-name> <branch-name>


如果分支名称包含斜杠,lstrip则将不起作用。而是remoteref可以使用。

git for-each-ref --format="%(upstream:remotename) %(upstream:remoteref)" refs/heads/<yourBranch>

输出格式如下:<remote-name> refs/heads/<branch-name>

要从refs/heads/输出中删除,请将上述命令通过管道传输到此

sed 's/refs\/heads\///g'
于 2019-12-20T11:16:07.687 回答
0

我会使用内置-v(详细)甚至-vv(非常详细)标志从git branch输出中获取此信息。您也可能只是 grep 分支名称以专注于您想要的内容:

git branch -vv | grep <branchName>

根据您想要获得的具体内容,也许还可以考虑使用管道工具:

git for-each-ref --format="%(upstream:short)" refs/heads/<yourBranch>

并为方便起见将其设为别名

git config --global alias.get-rem '!f() { git for-each-ref --format="%(upstream:short)" refs/heads/$1; }; f'

# then just
git get-rem branch_name

编辑:对于非常短的部分(即"branch"代替 any"refs/remotes/origin/branch"或 even "origin/branch"),您可以使用%(upstream:lstrip:-1)代替%(upstream:short)

于 2019-12-20T10:58:11.063 回答