题 如何在Git中克隆所有远程分支?


我有一个 master 和a development 分支,都推到了 GitHub上。我有 cloned, pull编辑和 fetched,但我仍然无法得到除了 master 分支回来。

我确定我错过了一些明显的东西,但是我已经阅读了手册,而且我一点也不开心。


3560
2017-09-15 22:42


起源


这里接受的答案(git branch -a)向您显示遥控器中的分支,但如果您尝试检查其中任何一个分支,您将处于“分离的HEAD”状态。下一个答案(第二个最高评价)回答了一个不同的问题(即:如何拉动所有分支,再次,这只适用于您在本地跟踪的那些)。一些评论指出你可以解析 git branch -a使用shell脚本生成本地跟踪所有远程分支的结果。简介:没有git本地方式来做你想做的事情,无论如何它可能不是那么好的想法。 - Day Davis Waterbury
也许只是以老式的方式复制整个文件夹? scp some_user@example.com:/home/some_user/project_folder ~ 不确定该解决方案是否适用于github .. - snapfractalpop
而不是说“我克隆,拉动和取出”,而不是向我们展示 确切的命令 你执行了。 - Bob Gilmore
它总是让我难以理解为什么“克隆”不是精确复制的意思。如果它是一个精确的克隆,不应该所有分支都是本地存储库的一部分吗?我的意思是不是那个被分发的点之一?因此,当某些存储库消失时,您仍然拥有所有内容的完整副本。或者它是所谓的“远程”真的已经是本地存储库的一部分了吗? - huggie
看到所有的赞成,答案,对答案的评论以及令人难以置信的数量的观点,我认为是时候git添加了这样做的命令。对,你是@huggie,我的想法完全正确。 - Sнаđошƒаӽ


答案:


首先,克隆一个遥控器 混帐 存储库和 光盘 进去:

$ git clone git://example.com/myproject
$ cd myproject

接下来,查看存储库中的本地分支:

$ git branch
* master

但是您的存储库中还隐藏着其他分支!你可以看到这些使用 -a 旗:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

如果您只是想快速查看上游分支,可以直接查看:

$ git checkout origin/experimental

但是如果你想在那个分支上工作,你需要创建一个本地跟踪分支,它由以下内容自动完成:

$ git checkout experimental

你会看到的

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

最后一行引发了一些人:“新分支” - 是吗? 它的真正含义是从索引中获取分支并在本地为您创建。该 以前 line实际上更具信息性,因为它告诉您正在设置分支以跟踪远程分支,这通常意味着origin / branch_name分支

现在,如果你看看当地的分支机构,你会看到:

$ git branch
* experimental
  master

您实际上可以使用跟踪多个远程存储库 git remote

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

在这一点上,事情变得非常疯狂,所以跑步 gitk 看看发生了什么:

$ gitk --all &

4024
2017-09-16 13:28



如何有人自动创建所有远程分支,例如原点/实验的实验? - Cristian Ciupitu
Cristian:我过去总是为每个分支'origin / foo'创建一个分支'foo',但是这导致了两个问题:(1)我结束了许多非常陈旧的跟踪分支,这些分支在相应的远程分支后面有许多提交,(2)在旧版本的git中,运行'git push'会尝试将所有本地分支推送到远程,即使这些分支过时。所以现在我只为我正在积极开发的东西保留本地分支,如果我需要有关它们的信息,可以直接访问origin / *分支。 (也就是说,您可以使用shell脚本来解析'git branch -a'。) - emk
“git fetch <origin-name> <branch-name>”为您提供本地分支。 - Orange Box
很好的答案,但有点想念这个问题。我正在寻找一个单行检查所有远程分支机构。 - cmcginty
问题是关于克隆所有远程分支,而不是检查它们。而且,正如我上面提到的,你真的不想再创建超过必要的本地跟踪分支,因为当它们变得非常陈旧时,它们会引起头痛。 - emk


如果您想要一次获取许多远程分支,请执行以下操作:

$ git pull --all

现在,您可以根据需要签出任何分支,而无需访问远程存储库。


745
2018-01-13 16:42



如果我做git clone,我在本地拥有master分支,在远程拥有10个分支。因此,Gabe的这个答案非常有帮助,并回答了这个问题。 - basZero
这只取得了本地添加的远程分支 任何 远程分支 - jujule
第一个命令是多余的。只是 git pull --all 会做同样的 - 它不会取两次。并且infosec812是对的,无论如何这都没有回答这个问题。我想知道这有多少赞成。 - Sven Marnach
我做了之后 git remote update,然后试过 git branch,我只看到当地的分支机构。但如果我这样做 git branch -a 我现在可以看到远程分支,我可以做一个 git pull <branchname> 得到我想要的分支。 - 我从Google搜索中找到了这个问题,这个答案解决了我的问题。 - Jazzerus
这根本没有帮助,除了存在之外,不会拉除任何远程分支。 - Avinash R


这个 巴什 脚本帮助我:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

它将为除master之外的所有远程分支创建跟踪分支(您可能从原始clone命令获得)。我想你可能还需要做一个

git fetch --all
git pull --all

为了确定。

一个班轮git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs 像往常一样:在我们知道复制rm -rf Universe之前测试你的设置

单行的积分转到用户cfi


379
2018-01-21 02:18



这非常接近于成为一个完美的解决方案。唯一能让它变得更好的是这个功能是否作为git中的一个选项内置。 - Deven Phillips
“单线”: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs   像往常一样:在复制之前在设置中进行测试 rm -rf universe as we know it - cfi
此命令从远程创建功能分支作为普通分支(不是功能分支) - 如何解决此问题? - Alex2php
如果你在分支名称中遇到“/”问题,下面有一个使用git别名的解决方案。看到“没人”的答案“于2013年5月15日11:02回答” - wemu
我正在修剪 remotes/origin/ 保留名称空间: for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done - kgadek


使用 --mirror 选项似乎复制了 remote 正确跟踪分支。 但是,它将存储库设置为裸存储库,因此您必须在之后将其重新转换为普通存储库。

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

参考: Git FAQ:如何使用所有远程跟踪分支克隆存储库?


280
2017-08-27 17:49



你知道这实际上似乎是一个非常好的答案,即使它没有投票。这样做有什么陷阱吗?运行这些命令后,我必须明确检出分支。 - loop
结合git push --mirror正是我从github.com转移到github企业安装时创建远程git仓库的精确副本所需要的。谢谢! - Jacob Fike
@Dave:添加决赛 git checkout 作为最后一个命令,最终检出克隆repo上当前分支的头部。这是一个很好的答案,是迄今为止最好的答案。勇敢,最终我们会把你带到顶端:-) - cfi
@Dave:嗯。我有第二个想法: - 镜像不仅仅是将所有分支设置为被跟踪。它复制来自原点和后续的所有引用 git remote update 会再做一次。拉动的行为改变了。我重新认为完整副本需要单行脚本。 - cfi
git clone --mirror 非常适合备份你的git存储库^ _ ^ - TrinitronX


您可以轻松切换到分支,而无需使用花哨的“git checkout -b somebranch origin / somebranch”语法。你可以这样做:

git checkout somebranch

Git会自动做正确的事情:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git将检查具有相同名称的分支是否仅存在于一个远程中,如果存在,则它将以与明确指定它是远程分支相同的方式跟踪它。从Git 1.8.2.1的git-checkout手册页:

如果找不到<branch>但是确实存在跟踪分支   只有一个具有匹配名称的远程(称为<remote>),视为   相当于

$ git checkout -b <branch> --track <remote>/<branch>

204
2018-05-12 12:11



所以,如果你的分支的名称 checkout 是与远程分支的名称相同,后面的所有内容都是“/”,那么git会创建一个同名的分支,一切都在“/”之后,“跟踪”即远程?通过跟踪,我们的意思是: git push, git pull等将在那个遥控器上完成?如果这是正确的,那么请扩展您的答案以获取更多信息,因为我与@Daniel签约,这个答案值得更多代表。 - Gerard Roche
@BullfrogBlues,你所有问题的答案似乎都是肯定的(我正在使用git v1.7.7.4)。我同意这种行为应该更为人所知。 (这不是这个版本的git的手册。)我实际上不喜欢这种行为,我宁愿得到一个错误,不得不说 git checkout --track origin/somebranch 明确。 - dubiousjim
@dubiousjim:实际上,这是在手册中。 git-checkout(1)说:“如果找不到<branch>但是在一个遥控器(称为<remote>)中确实存在一个具有匹配名称的跟踪分支,则视为等同于'git checkout -b <branch > --track <remote> / <branch>'“(Git V.1.8.1.1)。 - sleske
我们需要的是$ git pull * <remote> / * - 其中“*”是一个通配符,因此它会拉动所有分支,包括那些尚未在本地系统上分支的分支。这个怎么做?我们真的应该检查/拉出每个分支只是为了将代码拉到我们的本地系统吗? - JosephK


关于,

$ git checkout -b实验起源/实验

运用

$ git checkout -t origin/experimental

或者更详细但更容易记住

$ git checkout --track origin/experimental

在跟踪远程存储库方面可能会更好。


88
2017-07-27 06:10





您正在执行的获取应该获取所有远程分支,但它不会为它们创建本地分支。如果您使用gitk,您应该看到描述为“remotes / origin / dev”的远程分支或类似的东西。

要基于远程分支创建本地分支,请执行以下操作:

git checkout -b dev refs / remotes / origin / dev

哪个应该返回类似的东西:

Branch dev设置为跟踪远程分支refs / remotes / origin / dev。
切换到新的分支“dev”

现在,当你在dev分支上时,“git pull”会将你的本地dev更新为与远程dev分支相同的点。请注意,它将获取所有分支,但只将您所在的分支拉到树的顶部。


77
2017-09-15 22:52



你这里不需要refs / remotes。 git checkout -b dev origin / dev将正常工作。 - emk
这总是有效: git checkout -b newlocaldev --track origin/dev。如果您希望本地分支与远程分支具有相同的名称,而远程分支没有棘手的名称,则可以省略 -b newlocaldev。默认情况下 branch.autosetupmerge 配置设置,并假设您没有名为的本地分支 dev,这两个命令可能会做同样的事情: git checkout -b dev origin/dev 而且很简单 git checkout dev。最后, git checkout origin/dev 不创建新分支,但只是让你处于分离的HEAD状态。 - dubiousjim
当遥控器不再存在但Git太愚蠢而无法确认它已被删除时会发生什么?这假设你更新和 git branch -a 继续将其列为远程分支。 - jww
我们为几十个分支机构做这个? - JosephK


当您执行“git clone git:// location”时,将获取所有分支和标记。

为了在特定的远程分支上工作,假设它是原始远程:

git checkout -b branch origin/branchname

57
2017-09-15 22:47



我感谢您的注意事项“所有分支和标签都已获取”。我打算评论你的答案是错的,但后来我检查了一下,发现,你是完全正确的。所以在某种程度上,你提供了最短的答案 - 如果你克隆了,你已经拥有它。尼斯。人们可以尝试添加:尝试 $ git branch -a 学习,已经有哪些远程分支。 - Jan Vlcinsky


使用别名。虽然没有任何原生Git单行,但您可以将自己定义为

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

然后用它作为

git clone-branches

46
2018-05-15 11:02





这不是太复杂,非常简单和直接的步骤如下;

git fetch origin 这将使所有远程分支到您的本地。

git branch -a 这将显示所有远程分支。

git checkout --track origin/<branch you want to checkout>

通过以下命令验证您是否在所需的分支中;

git branch

输出将是这样的;

*your current branch 
some branch2
some branch3 

注意表示当前分支的*符号。


43
2017-12-26 10:19



谢谢suraj。原因是它没有被投票多少。并且提问者不接受ans。 - Sam
“git fetch origin”没有把任何远程分支带到我的本地 - 或者它们隐藏在某个地方?阅读上面的所有答案让我很头疼。我们正在寻找“git fetch所有分支到本地”。除了bash-scripts之外,必须有一种方法可以做到这一点。 - JosephK
在你执行“git fetch origin”之后,它会在你的终端显示这样的输出 - “* [new branch] branch_name - > origin / branch_name”,但是当你运行“git branch”时它只显示你的本地而不是分支,所以要看到你可以做的所有分支“git branch -a”,然后切换到远程分支,你需要运行“git checkout --track origin / <你想要结账的分支>”。希望这可以帮助。 :-) - Sam
Suraj,因为问题是,如何“克隆所有远程分支” - 而不是如何一次手动更新一个。似乎没有实际问题的答案 - 如果你有很多分支,只需要做很多打字的方法。 - JosephK
它对我有用。谢谢哥们 !! - Jagdish N


为什么你只看到“主人”

git clone 下载所有远程远程分支但仍将其视为“远程”,即使这些文件位于新的存储库中。这有一个例外,即克隆过程从名为“master”的远程分支创建一个名为“master”的本地分支。默认, git branch 只显示本地分支,这就是为什么你只看到“主”。

git branch -a 显示所有分支, 包括远程分支


如何获得当地分支机构

如果你真的想在一个分支上工作,你可能想要它的“本地”版本。简单地从远程分支创建本地分支 (不检查它们,从而改变工作目录的内容)你可以这样做:

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

在这个例子中, branchone 是您正在创建的本地分支的名称 origin/branchone;如果您想要创建具有不同名称的本地分支,则可以执行以下操作:

git branch localbranchname origin/branchone

一旦你创建了一个本地分支,你就可以看到它 git branch (记住,你不需要 -a 看当地的分支机构)。


42
2018-03-05 13:47



感谢您解释为什么只有master是唯一可见的分支 - AguThadeus