首页 文章

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

提问于
浏览
3679

我有 masterdevelopment 分支,都被推到GitHub . 我已经 clone d, pull 编辑和 fetch 编辑,但我仍然无法获得除了 master 分支以外的任何内容 .

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

30 回答

  • 4135

    这样做:

    $ 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'取出一切,甚至分支机构,您只需要签出它们,然后将创建您的本地分支机构 .

  • 10

    您正在执行的获取应该获取所有远程分支,但它不会为它们创建本地分支 . 如果您使用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分支相同的点 . 请注意,它将获取所有分支,但只将您所在的分支拉到树的顶部 .

  • 6

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

    $ git pull --all
    

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

  • 6

    使用您能记住的命令

    我正在使用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 CommandFetch CommandCheckout Command

  • 38

    截至2017年初,答案in this comment有效:

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

  • 21

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

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

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

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

    请注意,这是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
    
  • 77

    OK, 当你克隆你的回购时,那里有你所有的分支......

    如果你只是做 git branch ,它们有点隐藏......

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

    git branch --allgit branch -a

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

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

    在这种情况下,只需:

    git fetch

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

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

    git fetch && git checkout your_branch_name

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

  • 5

    对于复制粘贴到命令行:

    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
    

    这将:

    • 检查主人(这样我们就可以删除我们所在的分支)

    • select remote 结帐(将其更改为您拥有的任何遥控器)
      除了master和HEAD之外的远程

    • loop through all branches

    • delete 本地分支(以便我们可以查看强制更新的分支)

    • check out 来自遥控器的分支

    • 检查大师(为了它)

    基于answerVonC .

  • 5

    使用别名 . 虽然没有任何原生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
    
  • 57

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

    有时你可能有分支/标签没有直接连接到当前的分支/标签,所以 git pull --all / git fetch --all 在这种情况下无济于事,但你可以列出它们:

    git ls-remote -h -t origin
    

    并通过知道ref名称手动获取它们 .

    所以到 fetch them all ,试试:

    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
    

    by 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) .

  • 44

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

  • 382

    这个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之外的所有远程分支创建跟踪分支(您可能从原始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

  • 89

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

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

    git checkout -b branch origin/branchname
    
  • 23

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

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

    $ git branch -a
    

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

    $ git checkout -b branchname origin/branchname
    

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


    但是,当你想要克隆一个包含很多分支的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”命令 .

    • 第二步

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

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

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

    $ git reset --hard
    

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

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

  • 752

    从本地仓库克隆将无法使用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
    
  • 43

    我写了这个小的 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函数可以在my git settings repo上找到

  • 14

    为什么你只看到“主人”

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

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


    如何获得本地分支机构

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

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

  • 6
    #!/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
    

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

  • 40

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

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

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

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

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

    git branch
    

    输出将是这样的;

    *your current branch 
    some branch2
    some branch3
    

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

  • 12

    我需要完全一样 . 这是我的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

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

    (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
    
  • 2

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

  • 19

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

  • 48

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

  • 8

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

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

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

  • 12

    我要在这里加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
    
  • 11

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

    最后一行引发了一些人:"New branch" - 是吗?它的真正含义是从索引中获取分支并在本地为您创建 . 前一行实际上提供了更多信息,因为它告诉您正在设置分支以跟踪远程分支,这通常意味着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 &
    
  • 208

    关于,

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

    运用

    $ git checkout -t origin/experimental
    

    或者更详细但更容易记住

    $ git checkout --track origin/experimental
    

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

  • 290

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

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

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

    感谢bigfish的原创理念

  • 10

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

    将repo从一个服务器/系统移动到另一个服务器/系统时遇到了麻烦 . 当我克隆了repo时,它只为master创建了一个本地分支,所以当我推送到新的远程时,只推出了master分支 .

    所以我发现这两种方法非常有用 . 希望他们帮助别人 .

    Method 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
    

    Method 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
    

相关问题