【发布时间】:2011-06-24 10:58:25
【问题描述】:
我知道我可以做到git branch --all,它显示了本地和远程分支,但它在显示它们之间的关系方面没有多大用处。
如何以显示哪个本地分支正在跟踪哪个远程的方式列出分支?
【问题讨论】:
标签: git
我知道我可以做到git branch --all,它显示了本地和远程分支,但它在显示它们之间的关系方面没有多大用处。
如何以显示哪个本地分支正在跟踪哪个远程的方式列出分支?
【问题讨论】:
标签: git
非常漂亮的命令,如果你想用它来编写脚本就不好了:
git branch -vv # doubly verbose!
请注意,在 git 1.8.3 中,上游分支以 蓝色 显示(请参阅“What is this branch tracking (if anything) in git?”)
如果您想要干净的输出,请参阅arcresu's answer - 它使用了一个瓷器命令,我认为在我最初编写此答案时不存在,因此它更简洁一些,并且适用于为 rebase 配置的分支,而不是只是合并。
【讨论】:
git remote show origin
将“origin”替换为遥控器的名称。
【讨论】:
git remote show -n origin 获取一些信息。来自git remote documentation:“使用 -n 选项,不会首先使用 git ls-remote git remote show | xargs git remote show -n 来查看所有遥控器的组合跟踪信息。
如果您查看git-rev-parse 的手册页,您会看到描述了以下语法:
<branchname>@{upstream},例如master@{upstream},@{u}分支名称的后缀
@{upstream}(简称<branchname>@{u}) 指的是分支指定的分支 branchname 设置为构建在其之上。缺少的分支名称默认值 到当前的。
因此要找到分支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
# ...
这比手动解析 refs 和配置更干净。
【讨论】:
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/* 的单行代码
kubi 的替代方法是查看显示本地存储库配置的 .git/config 文件:
cat .git/config
【讨论】:
git config --get-regex branch
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'
对于 current 分支,这里有两个不错的选择:
% 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
这个答案也是here,对于一个稍微不同的问题,它被(错误地)标记为重复。
【讨论】:
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 remote -v,它显示了当前分支的所有来源和上游。
【讨论】:
我使用这个别名
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"
【讨论】: