Answers:
非常像瓷器命令,如果您希望使用它来编写脚本,则不好用:
git branch -vv # doubly verbose!
请注意,在git 1.8.3中,该上游分支显示为蓝色(请参阅“ git中的该分支跟踪是什么(如果有)? ”)
如果您想要干净的输出,请参阅arcresu的答案 -它使用的瓷器命令在我最初编写此答案时不存在,因此它更为简洁,可与配置用于重新设置基准的分支一起使用,而不仅仅是合并。
git remote show origin
用您的遥控器名称替换“ origin”。
git remote show
命令实际上连接到远程仓库...因此,如果您由于任何原因而脱机或无法连接到回购协议,则它将失败……
git remote show -n origin
即使离线也可以用来获取一些信息。从git远程文档中:“使用-n选项,首先不使用git ls-remote <name>查询远程头;而是使用缓存的信息。”
git remote show | xargs git remote show -n
以查看所有遥控器的组合跟踪信息。
如果查看的手册页git-rev-parse
,将会看到以下语法说明:
<branchname>@{upstream}
例如master@{upstream}
,@{u}
分支名称的后缀
@{upstream}
(缩写形式<branchname>@{u}
)是指由分支名称指定的分支设置为在其顶部构建的分支。缺少的分支名称默认为当前分支名称。
因此,要找到分支的上游master
,您可以执行以下操作:
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
要打印每个分支的信息,您可以执行以下操作:
while read branch; do
upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
if [[ $? == 0 ]]; then
echo $branch tracks $upstream
else
echo $branch has no upstream configured
fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)
# Output:
# master tracks origin/master
# ...
这比手动解析引用和配置干净。
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
注意glob模式末尾的两个星号。
git rev-parse --abbrev-ref HEAD@{upstream}
对于当前分支似乎运行良好。它还为git提供了一个很好的别名。
while
循环语法看起来有点怪我。您可以使用git for-each-ref ... | while read branch; do ...
不需要FIFO并以与编写命令相同的顺序运行的方法。
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
将为每个本地分支显示一行。跟踪分支如下所示:
master <- origin/master
非跟踪的代码如下所示:
test <-
git branch -vv
。🙏
git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
对于当前分支,这里有两个不错的选择:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
要么
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
这个答案也在这里,是一个稍有不同的问题(被错误地标记为重复)。
git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
。
对于当前分支,您也可以说git checkout
(不带任何分支)。这是一个没有副作用的操作,可以显示当前分支的跟踪信息(如果存在)。
$ git checkout
Your branch is up-to-date with 'origin/master'.
git checkout .
,这不是禁忌。
我用这个别名
git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'
然后
git track
if [ $# -eq 2 ]
then
echo "Setting tracking for branch " $1 " -> " $2
git branch --set-upstream $1 $2
else
echo "-- Local --"
git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
echo "-- Remote --"
REMOTES=$(git remote -v)
if [ "$REMOTES" != '' ]
then
echo $REMOTES
fi
fi
它仅显示配置了轨道的本地。
将其写在路径上名为git-track的脚本上,您将获得git track命令
git config --get-regexp "branch\.$current_branch\.remote"
将为您提供被跟踪的遥控器的名称
git config --get-regexp "branch\.$current_branch\.merge"
将为您提供被跟踪的远程分支的名称。
您需要将$ current_branch替换为当前分支的名称。您可以通过以下方式动态获取git rev-parse --abbrev-ref HEAD
以下迷你脚本结合了这些内容。将其粘贴到名为的文件中git-tracking
,使其可执行,并确保它在您的路径中。
那你可以说
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
请注意,远程分支名称可以与本地分支名称不同(尽管通常没有)。例如:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
如您在代码中看到的那样,关键是从git配置中提取数据。我只是使用sed清除了多余的数据。
#!/bin/sh
current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
sed -e "s/^.* //" -e "s/refs\/.*\///")
echo "$current_branch -> $remote/$remote_branch"