我从一个裸的远程存储库克隆了一个本地存储库。以下命令列出了远程存储库的分支。
$ 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
答案 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