【问题标题】:In git, how do I check out a remote repository's remote branches?在 git 中,如何查看远程存储库的远程分支?
【发布时间】:2011-03-03 11:36:15
【问题描述】:

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

$ git ls-remote <remote>

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

我想检查并跟踪远程的远程分支trunk。我该怎么做?

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

$ git branch -a

master
remotes/test
remotes/trunk

在运行 git fetch 以获取远程存储库的所有分支后,我在本地存储库中获得了此输出。

$ git branch -r

repo/HEAD -> repo/master
repo/master

【问题讨论】:

标签: git


【解决方案1】:

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

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

如果获取的 refspec 没有指定目标 ref,它将存储在特殊的 FETCH_HEAD ref 中。


将存储库的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.&lt;remote-name&gt;.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 以将 ref 存储到不相交的命名空间(…/heads/…/remotes/)。如果你愿意,你可以选择不同的名字。如果您确定不会有冲突,您甚至可以将它们都直接放在refs/remotes/remote-name/ 下。

【讨论】:

  • 我可以设置它,以便它自动将远程的远程分支拉入跟踪本地分支吗?还是我最好确保遥控器有自己的本地跟踪分支,然后我在本地跟踪?
  • @Hans:我已经重写了答案。我不再强调对您来说可能不那么重要的“未配置远程”方面,并在最后添加了一些关于自动获取的内容。
  • 如何设置本地分支来跟踪其中一个远程远程分支?我做了一个正确的'git checkout -b trunk --track repo/remotes/trunk',但是'git pull repo'不会理解我的branch.trunk.merge配置。我必须做一个 'git pull repo refs/remotes/trunk:refs/remotes/repo/remotes/trunk' 才能工作。
  • 我搞定了。我设置了获取远程错误的头部,这可能意味着 git 无法弄清楚 refs/remotes/trunk 指的是什么。
【解决方案2】:

好问题!我知道这行得通;我想不出还有什么其他的事情:

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/&lt;remote-name&gt;/&lt;branch-name&gt; 的形式...也许我误解了名称,但该方法确实有效。

【讨论】:

    【解决方案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/。

    【讨论】:

    • 不需要第二个遥控器,只需添加一个额外的获取配置。
    【解决方案4】:

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

    【讨论】:

    • 这里的问题是远程分支没有跟踪其远程分支的本地分支。
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 2011-01-09
    • 2013-02-21
    • 1970-01-01
    • 2014-11-27
    • 2012-01-03
    • 2014-09-03
    • 2015-03-25
    相关资源
    最近更新 更多