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

我有一个 "master "和一个 "development "分支,都推送到GitHub。我已经clone'd、pull'ed和fetch'ed,但除了master'分支外,我仍然无法取回其他东西。

我确信我错过了一些明显的东西,但我读了手册,却没有得到任何好处。

对该问题的评论 (12)
解决办法

首先,克隆一个远程的 [Git][1] 仓库,并将 [cd][2] 复制到其中。

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

接下来,看看你的版本库中的本地分支。

$ git branch
* master

但是在你的版本库中还隐藏着其他的分支!你可以通过-a标志来查看这些分支。 您可以使用-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'

最后一句话抛给了一些人。 "新分支"。

  • 嗯? 它真正的意思是,这个分支是从索引中提取的,然后在本地为你创建。 实际上,_previous_这行信息量更大,因为它告诉你,该分支正在被设置为跟踪远程分支,这通常指的是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 &

[1]: http://en.wikipedia.org/wiki/Git_%28software%29 [2]: http://en.wikipedia.org/wiki/Cd_%28command%29

评论(25)

如果你有很多远程分支要同时获取,可以这样做。

$ git pull --all

现在,你可以根据自己的需要检查任何分支,而无需打到远程仓库。

评论(13)

这个[Bash][1]脚本帮我解决了问题。

#!/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($;) `git branch -a | grep -v HEAD | perl -ne 'chomp($); s|^/*?\s||; 如果 (m|(.+)/(.+)| &&amp.not $d{$2}); s|^? 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

[1]: http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29

评论(11)

使用"--镜像 "选项似乎可以正确复制 "远程 "跟踪分支。 然而,它将版本库设置为裸库,所以你必须在之后将其转回普通版本库。

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: 如何克隆一个包含所有远程跟踪分支的版本库? ](https://git.wiki.kernel.org/index.php/Git_FAQ#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F)

评论(13)

你可以很容易地切换到一个分支,而不需要使用花哨的"git checkout -b somebranch origin/somebranch&quot。 语法。 你可以直接这样做。

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手册中可以看出。

如果<分支> 没有被找到,但确实有一个跟踪分支存在于

恰好一个遥控器(叫它<remote>)的名字相匹配,视为 相当于

$ git checkout -b < branch> --track /<branch&gt。

评论(5)

关于:

$ git checkout -b experimental origin/experimental

使用

$ git checkout -t origin/experimental

或更冗长但更容易记忆的方法。

$ git checkout --track origin/experimental

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

评论(1)

你正在做的fetch应该会得到所有的远程分支,但它不会为它们创建本地分支。如果你使用 gitk,你应该看到远程分支被描述为 "remotes/origin/dev" 或类似的东西。

要在远程分支的基础上创建一个本地分支,请做如下操作。

git checkout -b dev refs/remotes/origin/dev
这应该会返回类似的结果。
分支dev被设置为跟踪远程分支refs/remotes/origin/dev。
切换到一个新的分支"dev"
评论(4)

当你做"git clone git://location"时,所有分支和标签都会被取走。

为了在一个特定的远程分支之上工作,假设它是远程的原点。

git checkout -b branch origin/branchname
评论(4)

使用别名。 虽然没有任何本地的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
评论(0)

为什么你只看到"主人&quot。

git clone会下载所有远程分支,但仍然认为它们是"远程",即使文件位于你的新仓库中。 有一个例外,那就是克隆过程会创建一个名为"master&quot的本地分支。 从远程分支"master"创建一个本地分支。 默认情况下,git branch只显示本地分支,这就是为什么你只看到"master"。

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


如何获得当地的分支机构

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

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

评论(1)

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

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

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

git checkout --track origin/<你想检查的分支>

用下面的命令验证你是否在所需的分支中。

git branch

输出将是这样的。

*your current branch 
some branch2
some branch3 

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

评论(4)

迟到总比没有好,但这里有一个最好的方法。

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

这时你就有了一个完整的远程仓库的副本,包括它的所有分支(用git branch验证)。 如果你的远程仓库有自己的远程仓库,你可以用 --mirror代替 --bare

评论(8)

就这样做。

$ 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' 获取所有的东西,甚至是分支,你只需要签出它们,然后你的本地分支将被创建。

评论(0)

你只需要使用 "git clone" 就可以得到所有分支。

git clone 

即使你只看到主分支,你也可以用"git branch -a" 来查看所有分支。

git branch -a

而且你可以切换到任何你已经拥有的分支。

git checkout 

不要担心,当你"git clone"之后,你不需要连接远程repo,"git branch -a" 和"git checkout &quot。 可以在关闭wifi的情况下成功运行。 所以证明当你做"git clone"时,它已经复制了远程repo的所有分支。 之后,你就不需要远程repo了,你的本地已经有了所有的分支&#39。 代码。

评论(3)

git clone应该是复制整个版本库。 试着克隆它,然后运行 git branch -a。 它应该列出所有的分支。 如果你想切换到"foo"分支,而不是"master",使用git checkout foo

评论(5)

使用我的工具 [git_remote_branch][1] (你需要在你的机器上安装 Ruby)。 它是专门为了让远程分支操作变得非常简单而设计的。

每当它代表你做一个操作时,它都会在控制台用红色打印出来。 随着时间的推移,它们最终会深深地印在你的脑海里:-)

如果你不想让 grb 代你执行命令,只需使用 'explain' 功能。 这些命令将被打印到你的控制台,而不是为你执行。

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

注意,这是[alpha软件][1];-)

这里是你运行grb help时的帮助。

git_remote_branch version 0.2.6

使用方法

grb create branch_name [origin_server] 。

grb publish branch_name [origin_server]。

grb rename branch_name [origin_server] 。

grb delete branch_name [origin_server] 。

grb track branch_name [origin_server] 。

注释:如果没有指定origin_server,则名称为'origin'。

  • 如果没有指定origin_server,则假设名称为'origin' 被认为是 (git默认)
  • 重命名功能可以重命名当前分支

解释元命令。 你也可以在任何命令前加上 关键词'解释'。 而不是执行命令,git_remote_branch 将简单地输出你需要运行的命令列表,以实现 该目标。

例子。 grb解释创建 grb解释 创建 my_branch github

所有命令也都有别名。 create: create, new 删除。 删除、销毁、删除、删除、清除、rm 发布,发布。 发布,调整 重命名。 rename, rn, mv, move。 跟踪: 跟踪,跟随,抓住,取回

[1]: http://programblings.com/2008/08/06/time-to-git-collaborating-with-git_remote_branch/

评论(2)

我在这里看到的所有答案都是有效的,但有一个更干净的方法来克隆一个版本库,并一次性提取所有分支。

当你克隆一个版本库时,所有分支的信息都会被下载,但分支是隐藏的。 使用命令

$ git branch -a

你可以显示版本库的所有分支,并使用命令

$ git checkout -b branchname origin/branchname

然后你可以"下载&quot。 一次一个手动下载。


然而,当你想克隆一个有很多分支的repo时,上面所说明的所有方法都是冗长和繁琐的,而我要展示的是一种更清洁和更快速的方法,虽然它'是有点复杂。 你需要三个步骤来完成。

第一步

在你的机器上创建一个新的空文件夹,然后从版本库中克隆一个.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&quot.命令从终端看到。 命令就可以看到了。

2.第二步

通过将 git 配置中的布尔值 "bare&quot.切换为 false,将此版本库从空版本库切换为普通版本库。 的布尔值改为false,就可以把这个仓库从空仓库(裸仓库)切换到普通仓库。

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

抓取当前文件夹中的所有内容,并在本地机器上创建所有的分支,从而使其成为一个普通的repo。

$ git reset --hard

所以现在你只需要输入命令"git branch&quot。 你就可以看到所有的分支都被下载了。

这是一种快速的方式,你可以一次性克隆一个包含所有分支的git仓库,但这并不是你想对每个项目都这样做。

评论(2)

使用 git clone &amp.从本地 repo 克隆将无法工作。 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
评论(0)

好的,当你克隆你的repo时,你的所有分支都在那里......如果你只是做 "git branch",它们会被隐藏起来......。

如果你只做 "git branch",它们就会被隐藏起来......。

所以如果你想看到所有分支的名字,只需简单地添加--all标志,像这样。

git branch --allgit branch -a

如果你只是签出到分支,你就会得到你所需要的一切。

但如果你克隆后,别人创建的分支呢?

在这种情况下,只要做

git fetch

并再次检查所有分支...

如果你喜欢同时取回和签出,你可以这样做。

git fetch && git checkout your_branch_name

还制作了下面的图片给你,以简化我说的内容。

[! [git branch --all to get all branches][2]][2]

[2]: https://i.stack.imgur.com/gn2pi.png

评论(1)

看着问题的一个答案,我注意到它'可以缩短。

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

但要注意的是,如果其中一个远程分支被命名为,如。 admin_master,就不会被下载!

感谢bigfish的原创想法

评论(3)