在git中,如何查看远程存储库的远程分支?

时间:2010-06-14 11:29:46

标签: git

我从一个裸的远程存储库克隆了一个本地存储库。以下命令列出了远程存储库的分支。

$ git ls-remote <remote>

74bd3eb190edb39db04f6c0c4dbbb9e1e96bc6db    refs/remotes/test
85de54d6ae813c624b9623983e6b0a4948dae0fe    refs/remotes/trunk

我想结帐并跟踪该遥控器的远程分支 trunk 。我该怎么做?

请注意,这与签出远程存储库的本地分支不同。 这就是远程存储库的样子。

$ git branch -a

master
remotes/test
remotes/trunk

运行 git fetch&lt;远程&gt; 来获取所有远程存储库的分支,我在本地存储库中获得此​​输出。

$ git branch -r

repo/HEAD -> repo/master
repo/master

4 个答案:

答案 0 :(得分:11)

您可以从任何遥控器获取任何引用(只要服务器愿意提供给您)。在refs/heads/之外获取引用的关键是提供以refs/开头的完整引用路径。如果需要,您甚至可以从未配置为远程存储库的存储库中提取( git fetch 可以使用URL而不是远程名称)。

默认情况下,配置的遥控器只能从远程存储库的refs/heads/命名空间中获取,因此它们不会在refs/remotes/内拾取任何内容。但是,您可以使用refs/remotes/trunk之类的完整引用来引用其中的引用(remotes/trunk也可能有效,但也可能不明确。)

如果获取的refspec未指定目标引用,则它将存储在特殊的FETCH_HEAD引用中。


将存储库的refs/remote/trunk提取到FETCH_HEAD并将其作为分离的HEAD进行检查:

git fetch remote-name-or-url refs/remotes/trunk &&
git checkout FETCH_HEAD

相同,但创建一个命名的本地分支,而不是使用分离的HEAD:

git fetch remote-name-or-url refs/remotes/trunk &&
git checkout -b trunk-from-remote FETCH_HEAD

相同,但直接进入本地分支:

git fetch remote-name-or-url refs/remotes/trunk:trunk-from-remote &&
git checkout trunk-from-remote

如果您正在使用已配置的遥控器,则可以重写其remote.<remote-name>.fetch配置并添加额外的条目以自动从refs/heads/refs/remotes/获取。

# fetch branchs of remote into remote-name/heads/*
git config remote.remote-name.fetch '+refs/heads/*:refs/remotes/remote-name/heads/*' &&
# fetch remotes of remote into remote-name/remotes/*
git config --add remote.remote-name.fetch '+refs/remotes/*:refs/remotes/remote-name/remotes/*'

为避免可能的冲突,上面的示例将fetch配置为将refs存储到不相交的命名空间(…/heads/…/remotes/)。如果您愿意,可以选择不同的名称。如果您确定不会发生冲突,您甚至可以将它们直接填入refs/remotes/remote-name/

答案 1 :(得分:6)

好问题!我知道这有效;我想不出任何其他不可能做到的事情:

git fetch origin refs/remotes/trunk
git checkout FETCH_HEAD
# or make a branch to check out
git checkout -b remote-trunk FETCH_HEAD

顺便说一下,这些远程引用的格式不是refs/remotes/<remote-name>/<branch-name>,这很奇怪......也许我误解了这些名称,但方法确实有效。

答案 2 :(得分:3)

实际上,我找到了一个令人满意的解决方案。 添加远程设置refspec以获取并拉取其本地头。我设置了另一个我称之为/ repo-remotes /的遥控器,它可以获取遥控器的遥控器。 .git / config文件最终看起来像这样

[remote "repo"]
  url = ssh://git@<hostname>:<port>/repo
  fetch = +refs/heads/*:refs/remotes/repo/*

[remote "repo-remotes"]
  url = ssh://git@<hostname>:<port>/repo
  fetch = +refs/remotes/*:refs/remotes/repo-remotes/*

我可以这样做。

$ git fetch repo-remotes
$ git checkout -b remote-trunk --track remotes/repo-remotes/trunk

设置跟踪远程存储库的远程分支/ trunk /.

的本地分支

答案 3 :(得分:-1)

git.exe checkout --track -b trunk refs/remotes/trunk