it-swarm.cn

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

我有一个master和一个development分支,都被推送到 GitHub 。我有cloned,pulled和fetched,但我仍然无法获得除master分支以外的任何内容。

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

3819
Peter Coulton

首先,将远程 Git repository和 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'

最后一行引发了一些人:“新分支” - 呵呵?[。_____。]它的真正含义是分支取自索引并在本地为您创建。 previous 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 &
4191
emk

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

$ git pull --all

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

763
Gabe Kopley

这个 Bash 脚本帮助了我:

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

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

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宇宙之前在你的设置中测试我们知道它 

单行的积分转到用户cfi

388
bigfish

使用--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:如何使用所有远程跟踪的分支克隆存储库?

300
Dave

您可以轻松切换到分支,而无需使用花哨的“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>
208
Nikos C.

关于,

$ git checkout -b实验性原点/实验

运用

$ git checkout -t Origin/experimental

或者更详细但更容易记住

$ git checkout --track Origin/experimental

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

90
murphytalk

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

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

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

哪个应该返回类似:

分支开发设置跟踪远程分支refs/remotes/Origin/dev。
切换到新分支“dev”

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

78
Luuk Paulussen

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

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

git checkout -b branch Origin/branchname
57
elmarco

使用别名。虽然没有任何原生的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
49
nobody

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

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

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

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

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

git branch

输出将是这样的;

*your current branch 
some branch2
some branch3 

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

44
Sam

为什么你只看到“主人”

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

43
Cerran

迟到总比没有好,但这是最好的方法:

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

此时,您拥有远程仓库的完整副本及其所有分支(使用git branch进行验证)。如果您的远程仓库具有自己的远程仓库,则可以使用--mirror而不是--bare

42
Jacob Fike

这样做:

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

38
rapher

你只需要使用“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”时,它已经从远程仓库中复制了所有分支。之后,您不需要远程仓库,您的本地已经拥有所有分支机构的代码。 

23
Haimei

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

22
MattoxBeckman

使用我的工具 git_remote_branch (你需要在你的机器上安装Ruby)。它专门用于使远程分支操作变得容易。

每次代表您执行操作时,它都会在控制台上以红色打印。随着时间的推移,他们终于坚持到你的大脑:-)

如果您不希望grb代表您运行命令,只需使用'explain'功能即可。这些命令将打印到您的控制台,而不是为您执行。

最后,所有命令都有别名,以便更容易记忆。

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

这是运行grb help时的帮助:

 git_remote_branch版本0.2.6 
 
用法:[。_____。] 
 grb create branch_name [Origin_server] 
 
 grb发布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'为
(git's默认)
  - 重命名功能重命名当前分支
 
解释元命令:您还可以使用
关键字'explain'添加任何命令。 git_remote_branch 
不会执行命令,而只会输出您需要运行的命令列表来完成
目标。[。_____。] 
示例:[。_____。] grb explain create 
 grb explain create my_branch github 
 
所有命令也有别名:[。_____。] create:create,new 
 delete:delete,destroy, kill,remove,rm 
 publish:publish,remotize 
 rename:rename,rn,mv,move 
 track:track,follow,grab,fetch 
19
webmat

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

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

$ git branch -a

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

$ git checkout -b branchname Origin/branchname

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


但是,当你想要克隆一个包含很多分支的repo时,所有上面说明的方式都是冗长乏味的,这是我要展示的更清洁,更快捷的方式,尽管它有点复杂。您需要三个步骤来完成此任务:

  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配置的布尔值“裸”切换为false,将此存储库从空(裸)存储库切换到常规存储库:

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

抓取当前文件夹中的所有内容并在本地计算机上创建所有分支,从而使其成为正常的repo。 

$ git reset --hard

所以现在你可以输入命令“git branch”,你可以看到所有的分支都被下载了。 

这是您可以快速克隆包含所有分支的git存储库的快速方法,但这并不是您希望以这种方式为每个项目执行的操作。 

15
FedericoCapaldo

看一下这个问题的答案,我注意到它可以缩短它:

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

但请注意,如果其中一个远程分支被命名为例如admin_master它不会被下载!

感谢bigfish的原创理念

12
Tebe

好的, 当你克隆你的仓库时,那里有你所有的分支......

如果你只是做git branch,它们就是隐藏的......

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

git branch --allgit branch -a

如果您只是结帐到分行,您将获得所需的一切。

但是如果你克隆后由其他人创建分支怎么样?

在这种情况下,只需:

git fetch

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

如果您想同时获取和结账,您可以:

git fetch && git checkout your_branch_name

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

git branch --all to get all branches

12
Alireza

从本地仓库克隆将不适用于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
11
raisercostin
#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/Origin/} $branch
done

这些代码将所有远程分支代码拉到本地仓库。

11
Albert.Qing

对于复制粘贴到命令行:

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. 从远程检出 branch
  4. 看看大师(为了它)

基于 回答 / VonC

10
ikaruss

我写了这个小的 Powershell functions来检查我的所有git分支,它们都在Origin远程。

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设置repo上找到

8
gringo_dave

我需要完全一样。这是我的 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]
8
user43685

Git通常(未指定时)从一个或多个其他存储库中获取所有分支和/或标记(refs,参见: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

故障排除

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

  • 仔细检查你的遥控器(git remote -v),例如
    • 验证git config branch.master.remoteOrigin
    • 检查Origin是否通过以下方式指向正确的URL:git remote show Origin(请参阅此 post )。
6
kenorb

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

git fetch <Origin-name> <branch-name>为你带来了分支。虽然这不会立即拉出所有分支,但您可以单独执行此分支。

6
ashes999

这些答案都没有削减它,除非用户没人在正确的轨道上。

将repo从一个服务器/系统移动到另一个服务器/系统时遇到了麻烦。当我克隆了repo时,它只为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
6
Gaui

使用您能记住的命令

我正在使用Bitbucket,一个Atlassian的存储库托管服务。所以我试着关注他们的文档。这对我来说非常有效。使用以下简单和简短命令,您可以检出远程分支。

首先克隆您的存储库,然后切换到目标文件夹。最后但并非最不重要的是获取和结帐:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

而已。这里有一个更真实的例子:

git clone https://[email protected]/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

您将在文档中找到有关命令的详细信息: 克隆命令获取命令结帐命令

6
Phil

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

(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
5
jofel

原始回购的git clone --mirror适用于此。

git clone --mirror /path/to/original.git
git remote set-url Origin /path/to/new-repo.git
git Push -u Origin
3
Bernd Jungblut

我要在这里加2美分因为我在这里试图找出如何拉下我在本地删除的远程分支。起源不是我的,我不想经历重新克隆一切的麻烦 

这对我有用:

假设您需要在本地重新创建分支:

git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-Origin/recreated-branch-name

因此,如果我从gituser/master分叉到sjp然后将其分支到sjp/mynewbranch,它将如下所示:

$ git checkout -b mynewbranch
$ git branch -a
  master
  remotes/sjp/master
  remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch
2
Camwyn

派对有点晚了,但我觉得这样做有点诀窍:

mkdir YourRepo
cd YourRepo
git init --bare .git                       # create a bare repo
git remote add Origin REMOTE_URL           # add a remote
git fetch Origin refs/heads/*:refs/heads/* # fetch heads
git fetch Origin refs/tags/*:refs/tags/*   # fetch tags
git init                                   # reinit work tree
git checkout master                        # checkout a branch

如果这样做不受欢迎,我很想知道。但是,到目前为止,这对我有用。

0
Andy

此变体将克隆远程仓库,其中所有分支都在本地可用,而无需逐个检出每个分支。不需要花哨的脚本。

创建一个与您要克隆的repo名称相同的文件夹,例如:

mkdir somerepo
cd somerepo

现在执行这些命令,但使用实际的repo usersname/reponame 

git clone --bare [email protected]:someuser/somerepo.git .git
git config --bool core.bare false
git reset --hard
git branch

Voiala!你有所有的分支!

0
lacostenycoder

这是一个bash脚本,用于将git项目的所有分支和标记作为快照提取到单独的文件夹中。 

https://Gist.github.com/hfossli/7562257

也许不是直接问的,但有些人可能会来这里寻找这个解决方案。

0
hfossli