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


4129

我有一个master和一个development分支,都推送到GitHub上。我已经cloned,pulled和fetched,但是除了master分支返回之外,我仍然无法获得其他任何东西。

我敢肯定我遗漏了一些明显的东西,但是我已经阅读了手册,一点都没有高兴。


133
此处接受的答案(git branch -a)向您显示了远程中的分支,但是如果您尝试将其中的任何一个都签出,则您将处于“分离头”状态。下一个答案向下(第二高的投票数)回答了一个不同的问题(即:如何拉出所有分支,同样,这仅适用于您在本地跟踪的分支)。一些评论指出,您可以git branch -a使用将本地跟踪所有远程分支的Shell脚本解析结果。简介:没有git本机方法可以执行您想要的操作,而且它可能不是一个好主意。
Day Davis Waterbury 2012年

5
也许只是以老式的方式复制整个文件夹?scp some_user@example.com:/home/some_user/project_folder ~不知道该解决方案是否适用于github ..
snapfractalpop 2012年

19
与其说“我已经克隆,提取和获取”,还不如说给我们看您执行的确切命令
鲍勃·吉尔莫

57
它总是让我感到困惑,为什么“克隆”并不是精确的复制品。如果它是精确的克隆,那么所有分支都不应该是本地存储库的一部分吗?我的意思是那不是分发的重点之一吗?因此,当某个存储库不存在时,您仍然拥有所有内容的完整副本。还是所谓的“远程”确实是本地存储库的一部分?
huggie

21
看到所有的投票,答案,对答案的评论以及令人难以置信的观点,我认为是时候git添加了执行此操作的命令。对,你就是@huggie,完全是我的想法。
2016年

Answers:


4557

首先,克隆一个远程Git存储库并cd到其中:

$ 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'

最后一行引发了一些人:“新分支”-是吗?这实际上意味着分支是从索引中提取的,并为您本地创建。在前面的行实际上是更多的信息,因为它告诉你的分支正在建立跟踪远程分支,这通常意味着起源/ 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 &

119
某人如何自动创建所有远程分支,例如实验性起源/实验性分支?
Cristian Ciupitu 09年

54
克里斯蒂安(Cristian):我以前总是为每个分支“起源/ foo”创建一个分支“ foo”,但这导致了两个问题:(1)我陷入了很多真正陈旧的跟踪分支,这些分支在相应的远程分支后面都有很多提交,以及(2)在较旧版本的git中,运行“ git push”将尝试将我的所有本地分支推送到远程,即使这些分支是陈旧的。因此,现在我只保留我正在开发的东西的本地分支,如果需要有关它们的信息,则直接访问origin / *分支。(也就是说,您可以使用Shell脚本来解析“ git branch -a”。)
emk,

49
“ git fetch <来源名称> <分支名称>”会为您在本地关闭分支。

137
好的答案,但是有点遗漏了这个问题。我一直在寻找一种单线结帐的所有远程分支机构。
cmcginty 2010年

32
问题是关于克隆所有远程分支,而不是检出它们。而且,正如我在上面指出的那样,您真的不想建立超出必要范围的本地跟踪分支,因为当它们变得陈旧时,它们可能会引起头痛。
emk 2010年

822

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

$ git pull --all

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


12
如果我执行git clone,则我在本地拥有master分支,并且有10个“远程”分支。因此,Gabe的这个回答非常有帮助,可以回答问题。
basZero 2012年

38
这只会获取已在本地添加的远程分支,而不是任何远程分支
jujule 2012年

33
第一条命令是多余的。只需git pull --all做同样的事情-它不会两次获取。而infosec812是正确的,因为它无论如何都不能回答问题。我不知道这怎么得到这么多的支持。
斯文·马纳赫

6
完成之后git remote update,然后尝试git branch,我只看到本地分支。但是,如果可以,git branch -a我现在可以看到远程分支,并且可以通过a git pull <branchname>获得所需的分支。-我从Google搜索中找到了这个问题,这个答案解决了我的问题。
WNRosenberg

38
这一点都没有帮助,除了现有的分支之外,不拉任何远程分支。
Avinash R

446

这个Bash脚本帮助我:

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

它将为所有远程分支(主服务器除外)创建跟踪分支(您可能是从原始克隆命令获得的)。我认为您可能仍需要做一个

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


19
这确实是一个完美的解决方案。.使它变得更好的唯一一件事是,如果此功能是git中的一个内置选项。
德文·菲利普斯

51
“一个衬纸”: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 2012年

4
此命令从远程将特征分支创建为普通分支(不是特征分支)-如何解决此问题?
Alex2php 2014年

4
如果遇到分支名称中带有“ /”的问题,则可以使用git别名解决以下问题。请参阅“没人回答”“ 13年5月15日在11:02回答”
wemu

8
我只是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
而已

348

使用该--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常见问题解答:如何克隆具有所有远程跟踪分支的存储库?


7
您知道这实际上是一个很好的答案,即使它没有投票。这样做有什么陷阱吗?运行这些命令后,我必须显式签出一个分支。
2012年

27
这与git push --mirror结合在一起,正是从github.com迁移到github企业安装时创建远程git repo的精确副本所需要的。谢谢!
Jacob Fike 2012年

3
@Dave:添加final git checkout作为最后一条命令,以最终检出克隆的仓库上当前分支的头部。这是一个很好的答案,到目前为止是最好的。勇敢一点,最终我们会带您到达顶端:-)
cfi

3
@戴夫:嗯。我有第二个想法:--mirror不仅仅是将所有分支都设置为被跟踪。它从原点复制所有引用,随后git remote update将再次这样做。拉动行为改变。我回到相信完整的副本需要一个单行脚本。
cfi 2012年

5
git clone --mirror非常适合备份您的git存储库^ _ ^
TrinitronX

220

您可以轻松切换到分支,而无需使用奇特的“ 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>

1
因此,如果您的分支checkout名称与远程分支的名称相同,则在“ /”之后的所有内容,然后git将创建一个同名的分支,在“ /”之后的所有内容,“跟踪”该远程?并通过跟踪,我们的意思是:git pushgit pull,等将是遥控器上做什么?如果正确,请在答案上提供更多信息,因为我同意@Daniel的观点,因此该答案值得您多指。
Gerard Roche

5
@BullfrogBlues,所有问题的答案似乎都是(我正在使用git v1.7.7.4)。我同意应该更了解这种行为。(此版本的git不在手册中。)我实际上不喜欢这种行为,我宁愿遇到错误,也必须git checkout --track origin/somebranch明确地说出来。
dubiousjim 2012年

3
@dubiousjim:实际上,这在手册中。git-checkout(1)说:“如果未找到<branch>,但确实在一个具有匹配名称的远程站点(称为<remote>)中存在跟踪分支,则将其等同于'git checkout -b <branch > --track <远程> / <分支>'“(Git V.1.8.1.1)。
sleske

我们需要的是$ git pull * <remote> / *-其中“ *”是通配符,因此它将提取所有分支,包括尚未在本地系统上的那些分支。这个怎么做?我们是否真的应该签出/拉出每个分支只是为了将代码拉到我们的本地系统?
JosephK '17

98

关于,

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

使用

$ git checkout -t origin/experimental

或更冗长但更容易记住

$ git checkout --track origin/experimental

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


所以您的意思是第二种形式更容易记住,没有其他区别吗?
aderchox

79

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

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

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

应该返回如下内容:

设置分支开发以跟踪远程分支引用/远程/原始/开发。
切换到新的分支“ dev”

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


14
您在这里不需要参考/远程处理。git checkout -b dev origin / dev可以正常工作。
emk

3
这将始终有效:git checkout -b newlocaldev --track origin/dev。如果您希望本地分支与远程分支具有相同的名称,并且远程分支没有棘手的名称,则可以省略-b newlocaldev。使用默认的branch.autosetupmergeconfig设置,并假设您没有名为的本地分支dev,这两个命令可能会执行相同的操作:git checkout -b dev origin/dev和plain git checkout dev。最后,git checkout origin/dev不创建新分支,而只是将您置于分离的HEAD状态。
dubiousjim 2012年

当遥控器不再存在但Git太愚蠢而无法确认其已删除时,会发生什么?这假定您已更新,并git branch -a继续将其列为远程分支。
jww '16

我们为数十个分支机构执行此操作?
JosephK '17

59

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

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

git checkout -b branch origin/branchname

2
感谢您的注释“所有分支和标签均已获取”。我本来要评论您的答案有误,但后来我检查了一下,发现您完全正确。因此,从某种意义上说,您提供了最短的答案-如果您进行了克隆,则已经有了答案。真好 一个可以尝试添加的方法:尝试$ git branch -a学习哪些远程分支已经可用。
Jan Vlcinsky

看看我发布的答案。如果您知道要在许多远程分支机构中进行本地工作,而不必一一检查它们,这可能会有所帮助。
lacostenycoder

你能告诉我git checkout -b master origin/mastergit checkout --track origin/master请问有什么区别吗?
aderchox

1
@aderchox如今,我认为没有。
elmarco

58

使用别名。虽然没有任何本地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

谢谢。实际上,这会克隆所有远程分支,这与其他几个答案不同
FearlessHyena

50

为什么只看到“主人”

git clone下载所有远程分支,但即使文件位于您的新存储库中,也仍然将它们视为“远程”。唯一的例外是,克隆过程会从称为“ master”的远程分支创建一个名为“ master”的本地分支。默认情况下,git branch仅显示本地分支,这就是为什么您只看到“ master”的原因。

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查看本地分支)。


如果origin/branchone存在,您也可以只使用git checkout branchone相同的名称创建一个本地分支并将其设置为远程跟踪。
伊文

47

这并不太复杂,非常简单直接的步骤如下:

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

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

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

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

git branch

输出将像这样;

*your current branch 
some branch2
some branch3 

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


1
谢谢你。原因是它没有被投票太多。提问者不接受ans。
2015年

“ git fetch起源”没有将任何远程分支带到我的本地-还是它们隐藏在某个地方?阅读以上所有答案使我头疼。我们正在寻找“ git获取所有本地分支”。除了bash脚本之外,还必须有其他方法可以做到这一点。
JosephK

1
在执行“ git fetch origin”之后,它将在终端中显示如下输出-“ * [new branch] branch_name-> origin / branch_name”,但是当您运行“ git branch”时,它将仅显示本地分支,所以要查看所有分支,您可以执行“ git branch -a”,然后切换到远程分支,您需要运行“ git checkout --track origin / <想要结帐的分支>”。希望这可以帮助。:-)
山姆

4
Suraj,因为问题是,如何“克隆所有远程分支”-而不是如何一次手动更新一个。看来,实际问题没有答案-如果您有很多分支机构,则只是进行大量打字的方法。
JosephK

47

迟到总比不到好,但这是执行此操作的最佳方法:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

至此,您已拥有远程回购及其所有分支的完整副本(通过验证git branch)。如果您的远程仓库有自己的远程服务器--mirror--bare则可以使用代替。


在这里进行编辑时出了点问题。现在这个答案没有意义。--bare最后一句中提到的“ ”在给定的命令列表中不存在。
Cerran 2014年

取自以下Dave的答案。使用'git config --bool core.bare false'代替'git config unset core.bare'似乎可以完成任务。
困惑的Vorlon 2014年

我有error: key does not contain a section: unset。在Dave的答案更好地工作。
olibre 2015年

git config --unset core.bare其实......对我来说,这似乎是所有在这里的答案提出的干净的解决方案。可惜它的投票很少...
Dirk Hillbrecht

1
谢谢@ChrisSim我同意git config --bool core.bare false。这就是为什么我推荐Dave的答案的原因。您如何看待戴夫的答案?干杯
olibre

39

只是这样做:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

您会看到,'git clone git://example.com/myprojectt'会获取所有内容,甚至是分支,您只需要检出它们,即可创建本地分支。


25

您只需要使用“ git clone”即可获取所有分支。

git clone <your_http_url>

即使只看到master分支,也可以使用“ git branch -a”查看所有分支。

git branch -a

您可以切换到任何已有的分支。

git checkout <your_branch_name>

不用担心,在您进行“ git clone”操作后,无需连接远程回购协议,当您关闭wifi时,“ git branch -a”和“ git checkout”可以成功运行。因此证明,当您执行“ git clone”时,它已经从远程仓库中复制了所有分支。在那之后,您不需要远程仓库,您的本地已经有了所有分支机构的代码。


这里的回答很明确。许多人对此话题感到困惑。
XMAN

我想支持您的陈述“关闭wifi即可成功运行”。“ git clone”确实会导致包含所有分支的仓库。
bvgheluwe

一个很好的简单明了的答案。
Amr

24

A git clone应该复制整个存储库。尝试克隆它,然后运行git branch -a。它应该列出所有分支。如果这样您想切换到分支“ foo”而不是“ master”,请使用git checkout foo


1
您可以使用带或不带连字符的git命令。“ git-branch”和“ git branch”都将起作用。
彼得·布顿

21
也许很久以前,当git的工作方式不同时,就给出了这个答案,但是我认为它在今天是令人误解的。git clone确实下载了所有远程分支,但它仅使master成为本地分支。由于git branch仅显示本地分支,因此您也需要git branch -a查看远程分支。
Cerran 2014年

谢谢。这是IMO的一种奇怪的默认行为。我将其归纳为更多隐晦的混血。如果下载了分支,为什么在调用git branch时将其隐藏?
亚当·休斯

1
@Cerran,谢谢;我已经相应更新了答案。
MattoxBeckman

“下载所有远程分支,但仅使本地分支成为master分支”。我需要帮助来了解这一点。似乎git clone不会克隆除master以外的任何分支,因为当您执行“ git branch -a”时,它表明“ develop”分支仅位于“ remotes / origin / develop”。这必须说您在本地任何地方都没有此分支,而该分支当前仅存在于源头上,对吗?
约翰·利特尔

19

使用我的工具git_remote_branch(您需要在机器上安装Ruby)。它是专门为使远程分支操作变得简单而构建的。

每次它代表您执行操作时,它将在控制台上以红色打印。随着时间的流逝,它们最终进入您的大脑:-)

如果您不想让grb代表您运行命令,则只需使用“说明”功能。这些命令将被打印到您的控制台上,而不是为您执行。

最后,所有命令都具有别名,以便于记忆。

请注意,这是Alpha软件;-)

这是运行grb help时的帮助:

git_remote_branch版本0.2.6

  用法:

  grb create branch_name [origin_server] 

  grb发布branch_name [origin_server] 

  grb重命名branch_name [origin_server] 

  grb delete分支名称[origin_server] 

  grb track branch_name [origin_server] 



  笔记:
  -如果未指定origin_server,则假定名称为“ origin” 
    (git的默认值)
  -重命名功能可重命名当前分支

  说明元命令:您还可以在任何命令前添加 
关键字“说明”。git_remote_branch代替执行命令
只会输出您需要运行以完成的命令列表 
这个目标。

  例: 
    解释
    grb解释创建my_branch github

  所有命令还具有别名:
  创建:创建,新
  删除:删除,销毁,杀死,删除,rm
  发布:发布,远程处理
  重命名:重命名,rn,mv,移动
  跟踪:跟踪,跟踪,抓取,提取

6
明智的话:这个问题似乎在发布此答案的时间就被放弃了。在2008年之后,我找不到任何更新。如果我错了,我希望有人可以编辑并提供当前的指针,因为我很想拥有一个像这样的工具。
bradheintz 2011年

@bradheintz检查此答案,它设置了一个git别名:stackoverflow.com/a/16563327/151841
user151841 '19

19

我在这里看到的所有答案都是有效的,但是有一种更干净的方法来克隆存储库并一次拉出所有分支。

克隆存储库时,实际上会下载所有分支的信息,但是分支是隐藏的。用命令

$ git branch -a

您可以显示存储库的所有分支,并使用以下命令

$ git checkout -b branchname origin/branchname

您可以一次手动“下载”它们。


但是,当您要克隆带有许多分支的仓库时,相对于我将要展示的一种更干净,更快捷的方法,上述所有方法都是冗长而乏味的,尽管有点复杂。您需要完成以下三个步骤:

  1. 第一步

在您的机器上创建一个新的空文件夹,并从存储库中克隆.git文件夹的镜像副本:

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

文件夹my_repo_folder内的本地存储库仍然为空,现在只有一个隐藏的.git文件夹,您可以从终端使用“ ls -alt”命令查看该文件夹。

  1. 第二步

通过将git配置的布尔值“ bare”切换为false,将此存储库从空(裸)存储库切换为常规存储库:

$ git config --bool core.bare false
  1. 第三步

抓取当前文件夹内的所有内容,并在本地计算机上创建所有分支,因此将其作为常规存储库。

$ git reset --hard

因此,现在您只需键入命令“ git branch”,即可看到所有分支均已下载。

这是一种可以一次克隆所有分支的git存储库的快速方法,但是您不想以此方式对每个项目进行操作。


我不喜欢您在...一次“手动下载”中使用“下载”一词。实际上,所有信息都已经在克隆存储库之后下载了。唯一需要做的就是创建本地跟踪分支(离线时也是可能的,这证明所有信息都在存储库中)。
bvgheluwe

@bvgheluwe这就是为什么用引号引起来。
FedericoCapaldo

15

从本地存储库克隆不适用于git clone和git fetch:许多分支/标签将保持未提取状态。

获得具有所有分支和标签的克隆。

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

要获得具有所有分支和标签以及工作副本的克隆,请执行以下操作:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

13

好的,克隆仓库时,所有分支都在那里...

如果您只是这样做git branch,它们就是隐藏的...

因此,如果您想查看所有分支名称,只需添加如下--all标记:

git branch --all 要么 git branch -a

如果您仅结帐至分支机构,则将获得所需的一切。

但是克隆后如果其他人创建的分支又如何呢?

在这种情况下,请执行以下操作:

git fetch

然后再次检查所有分支...

如果您想同时提取和结帐,可以执行以下操作:

git fetch && git checkout your_branch_name

还为您创建了以下图像,以简化我所说的内容:

git branch --all获取所有分支


3
“拥有”和“看到”之间是有区别的。当您删除远程存储库时,git branch -all将不再列出远程分支。
古斯塔夫

12

在查看问题的答案之一时,我注意到可以将其缩短:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

但是要注意,如果远程分支之一被命名为admin_master,它将不会被下载!

感谢bigfish的初衷


您可以改进正则表达式,或者使用Awk代替grep来改进过滤器,以防止误报。
2015年

所有分支都是“ origin \ my_branch_name”,这绝对不是我想要的。
Sнаđошƒаӽ

我以前没看过构造$ {branch ## * /}-看起来真的很有用-我知道在哪里可以找到更多信息吗?似乎在任何地方都找不到bash。谢谢。
SaminOz


10

对于复制粘贴到命令行:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

为了提高可读性:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


这将:

  1. 签出主人(以便我们可以删除我们所在的分支)
  2. 选择要签出的遥控器(将其更改为您拥有的任何遥控器)
  3. 遍历遥控器的所有分支(主服务器和HEAD除外)
    1. 删除本地分支(以便我们可以签出强制更新的分支)
    2. 从远程签出分支
  4. 签出主人(为此)

基于答案VonC


10

我编写了这个小的Powershell函数,以便能够检出我的所有git分支,这些分支位于源远程。

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

我的git设置库中可以找到更多的git功能


9

这是使用awk的答案。如果在新的仓库上使用该方法就足够了。

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

现有分支将仅被检出或声明为已经存在,但是可以添加过滤器以避免冲突。

也可以对其进行修改,以便调用显式git checkout -b <branch> -t <remote>/<branch>命令。

该答案遵循Nikos C.想法


另外,我们可以指定远程分支。这是基于murphytalk答案

git branch -r | awk '{ system("git checkout -t " $NF) }'

它在冲突时引发致命的错误消息,但我认为它们无害。


这两个命令都可以使用别名。

使用没人答案作为参考,我们可以使用以下命令来创建别名:

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

我个人会使用track-alltrack-all-branches


只是想谢谢你。这非常有效,并且不会遭受与克隆裸
仓库

8

我需要做的完全一样。这是我的Ruby脚本。

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]

请参阅我进一步发布的答案,以避免完全运行此脚本。
lacostenycoder

8

这些答案都没有解决这个问题,只是没有人在正确的轨道上。

我在将存储库从一个服务器/系统移动到另一个服务器/系统时遇到了麻烦。当我克隆存储库时,它仅为master创建一个本地分支,因此当我推送到新的远程服务器时,只推送了master分支。

因此,我发现这两种方法非常有用。希望他们能帮助别人。

方法1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

方法2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

8

git clone --mirror 在原始回购上可以很好地做到这一点。

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin

7

Git通常(未指定时git ls-refs)从一个或多个其他存储库中获取所有分支和/或标签(参考,请参阅:)以及完成其历史记录所需的对象。换句话说,它获取已下载对象可访问的对象。请参阅:实际上git fetch是做什么的?

有时您的分支/标记可能没有直接连接到当前分支/标记,因此在这种情况下git pull --all/ git fetch --all不会有所帮助,但是您可以通过以下方式列出它们:

git ls-remote -h -t origin

并通过了解引用名称手动获取它们。

因此,要全部获取,请尝试:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000如果您已使存储库变浅,则该参数可能会有所帮助。

然后再次检查所有分支:

git branch -avv

如果上述方法无济于事,则需要手动将丢失的分支添加到跟踪列表中(因为它们以某种方式丢失了):

$ git remote -v show origin
...
  Remote branches:
    master      tracked

通过git remote set-branches像:

git remote set-branches --add origin missing_branch

因此它可能会在remotes/origin获取后显示在下面:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

故障排除

如果您仍然无法获得master分支以外的任何其他内容,请检查以下内容:

  • 仔细检查您的遥控器(git remote -v),例如
    • 验证git config branch.master.remoteorigin
    • 通过以下方法检查是否origin指向正确的URL git remote show origin(请参阅此帖子)。

7

截至2017年初,此评论中的答案有效:

git fetch <origin-name> <branch-name>为您带来分支。尽管这不会一次拉出所有分支,但您可以按分支单独执行此操作。


这要求您一次获取一个分支。如果您有很多分支,则不是很好。
lacostenycoder

6

这是另一个简短的单线命令,它为所有远程分支创建本地分支:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

如果已经创建了跟踪本地分支,它也可以正常工作。您可以在第一次git clone或之后的任何时间调用它。

如果您不需要master在克隆后签出分支,请使用

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.