代码之家  ›  专栏  ›  技术社区  ›  Peter Coulton

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

  •  3743
  • Peter Coulton  · 技术社区  · 16 年前

    我有一个 master 和A development 分支,都被推到 GitHub . 我已经 clone D pull ED,以及 fetch 艾德,但我仍然无法得到除 主人 分支回来。

    我肯定我遗漏了一些明显的东西,但我已经阅读了手册,我一点也不高兴。

    35 回复  |  直到 6 年前
        1
  •  4178
  •   sebastian-c    7 年前

    首先,克隆一个远程 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'
    

    最后一句话让一些人觉得:“新的分支”—嗯? 它真正意味着分支是从索引中提取的,并在本地为您创建的。这个 以前的 行实际上提供了更多的信息,因为它告诉您正在设置分支以跟踪远程分支,这通常意味着源/分支名称分支

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

    $ 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 &
    
        2
  •  760
  •   Gabe Kopley    10 年前

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

    $ git pull --all
    

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

        3
  •  388
  •   ypid udondan    8 年前

    这个 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 Universe之前在您的设置中进行测试

    一条班轮的学分归用户CFI

        4
  •  297
  •   oHo Denis Tulskiy    9 年前

    使用 --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: How do I clone a repository with all remotely tracked branches?

        5
  •  208
  •   Nikos C.    11 年前

    您可以轻松地切换到分支,而无需使用花哨的“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手册页:

    如果找不到分支,但中确实存在跟踪分支 只有一个具有匹配名称的遥控器(称之为“遥控器”),视为 相当于

    $ git checkout -b <branch> --track <remote>/<branch>
    
        6
  •  90
  •   xverges IrocD    11 年前

    关于,

    $git结帐-B实验来源/实验

    使用

    $ git checkout -t origin/experimental
    

    或者更详细但更容易记住

    $ git checkout --track origin/experimental
    

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

        7
  •  78
  •   Luuk Paulussen    16 年前

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

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

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

    它应该返回如下内容:

    Branch dev set up to track remote branch refs/remotes/origin/dev.
    Switched to a new branch "dev"

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

        8
  •  57
  •   elmarco    16 年前

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

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

    git checkout -b branch origin/branchname
    
        9
  •  49
  •   Peter Mortensen icecrime    11 年前

    使用别名。虽然没有任何本地的git-one行程序,但是您可以将自己的定义为

    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
    
        10
  •  44
  •   Sam    8 年前

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

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

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

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

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

    git branch
    

    输出将像这样;

    *your current branch 
    some branch2
    some branch3 
    

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

        11
  •  43
  •   Cerran    11 年前

    为什么你只看到“大师”

    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分支 (记住,你不需要 -a 查看本地分支)。

        12
  •  42
  •   Jacob Fike    7 年前

    迟做总比不做好,但最好的方法是:

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

    此时,您已经拥有远程回购及其所有分支的完整副本(请使用 git branch )你可以使用 --mirror 而不是 --bare 如果你的远程回购有自己的远程。

        13
  •  38
  •   Zombo tliff    11 年前

    只要这样做:

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

        14
  •  23
  •   Haimei    10 年前

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

    git clone <your_http_url>
    

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

    git branch -a
    

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

    git checkout <your_branch_name>
    

    不用担心,在你“Git克隆”之后,你不需要连接远程回购,“Git分支-A”和“Git结算”可以在你关闭WiFi时成功运行。因此,事实证明,当您执行“git克隆”时,它已经从远程repo复制了所有分支。在那之后,你不需要远程回购,你的本地已经有了所有分支机构的代码。

        15
  •  22
  •   MattoxBeckman    7 年前

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

        16
  •  19
  •   webmat    16 年前

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

    每次它代表您执行操作时,都会在控制台上以红色打印它。随着时间的推移,它们最终会进入你的大脑:—)

    如果您不希望GRB代表您运行命令,只需使用“解释”功能即可。命令将打印到控制台,而不是为您执行。

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

    注意这是 alpha software ;-)

    以下是运行GRB帮助时的帮助:

    git_remote_branch version 0.2.6
    
      Usage:
    
      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] 
    
    
    
      Notes:
      - If origin_server is not specified, the name 'origin' is assumed 
        (git's default)
      - The rename functionality renames the current branch
    
      The explain meta-command: you can also prepend any command with the 
    keyword 'explain'. Instead of executing the command, git_remote_branch 
    will simply output the list of commands you need to run to accomplish 
    that goal.
    
      Example: 
        grb explain create
        grb explain create my_branch github
    
      All commands also have aliases:
      create: create, new
      delete: delete, destroy, kill, remove, rm
      publish: publish, remotize
      rename: rename, rn, mv, move
      track: track, follow, grab, fetch
    
        17
  •  15
  •   Fed    9 年前

    我在这里看到的所有答案都是有效的,但是有一种更干净的方法可以克隆存储库并同时提取所有分支。

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

    $ 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_文件夹中的本地存储库仍然是空的,只有一个隐藏的.git文件夹,现在您可以通过终端上的“ls-alt”命令看到它。

    1. 第二步

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

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

    获取当前文件夹中的所有内容,并在本地计算机上创建所有分支,因此这是一个正常的repo。

    $ git reset --hard
    

    现在您只需键入命令“git branch”,就可以看到所有的分支都已下载。

    这是一种快速的方法,您可以用所有分支同时克隆一个Git存储库,但这不是您想用这种方法为每个项目做的事情。

        18
  •  12
  •   Tebe    10 年前

    看一看这个问题的答案,我发现可以缩短它:

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

    但是要小心,如果其中一个远程分支被命名为管理主机,它将不会被下载!

    多亏了大鱼的创意

        19
  •  12
  •   Alireza    7 年前

    好啊, 克隆回购协议时,所有分支都在那里…

    如果你只是这样做 git branch 它们是隐藏的…

    因此,如果您想查看所有分支的名称,只需添加 --all 像这样的旗帜:

    git branch --all git branch -a

    如果你只是到分行结帐,你就可以得到你所需要的一切。

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

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

    git fetch

    再次检查所有分支…

    如果您希望同时提取和签出,可以执行以下操作:

    git fetch && git checkout your_branch_name

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

    git branch --all to get all branches

        20
  •  11
  •   Albert.Qing    8 年前
    #!/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
    

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

        21
  •  11
  •   raisercostin    8 年前

    从本地回购进行克隆不适用于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
    
        22
  •  10
  •   Community CDub    7 年前

    对于复制粘贴到命令行:

    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. 签出master(以便删除我们所在的分支)
    2. 选择遥控器 签出(将其更改为您拥有的任何远程设备)
    3. 循环通过所有分支 遥控器的,除了主控器和头
      1. 删除 本地分支(以便我们可以查看强制更新的分支)
      2. 退房 从远程分支
    4. 退房主人(为了它)

    基于 answer 属于 VonC .

        23
  •  8
  •   Peter Mortensen icecrime    11 年前

    我也需要这样做。这是我的 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]
    
        24
  •  8
  •   gringo_dave    8 年前

    我写的这个小 动力壳 函数可以签出所有Git分支,这些分支位于Origin Remote上。

    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函数 my git settings repo

        25
  •  6
  •   Phil    9 年前

    使用可以记住的命令

    我使用的是BitBucket,它是一个Atlassian的存储库托管服务。所以我试着去看他们的医生。这对我来说非常有效。通过以下简单和简短的命令,您可以签出远程分支。

    首先克隆存储库,然后更改为目标文件夹。最后,但不是最不重要的是取和签出:

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

    就是这样。这里有一个更真实的例子:

    git clone https://username@bitbucket.org/team/repository.git project_folder
    cd project_folder
    git fetch && git checkout develop
    

    您将在文档中找到有关命令的详细信息: Clone Command , Fetch Command , Checkout Command

        26
  •  6
  •   Community CDub    7 年前

    Git通常(未指定时)获取所有分支和/或标记(参考,请参见: git ls-refs )来自一个或多个其他存储库以及完成其历史所需的对象。换句话说,它获取已经下载的对象可以访问的对象。见: What does git fetch really do?

    有时您可能有与当前分支/标签没有直接连接的分支/标签,因此 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.remote origin .
      • 检查是否 起源 通过以下方式指向正确的URL: git remote show origin (见此 post )
        27
  •  6
  •   Community CDub    7 年前

    截至2017年初,答案是 in this comment 作品:

    git fetch <origin-name> <branch-name> 把树枝拿下来给你。虽然这不会一次拉动所有分支,但您可以对每个分支单独执行此操作。

        28
  •  5
  •   Gaui    10 年前

    除了用户之外,这些答案没有一个切中要害,没有人是正确的。

    我在将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
    
        29
  •  5
  •   jofel    9 年前

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

    (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
    
        30
  •  3
  •   Bernd Jungblut    6 年前

    git clone --mirror 在原始回购协议上,这一点很有效。

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