【问题标题】:How to clone all remote branches in Git如何在 Git 中克隆所有远程分支
【发布时间】:2010-09-09 05:21:13
【问题描述】:

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

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

【问题讨论】:

  • 此处接受的答案 (git branch -a) 向您显示远程中的分支,但如果您尝试检查其中任何一个,您将处于“分离 HEAD”状态。下一个答案(第二多的赞成票)回答了一个不同的问题(即:如何拉所有分支,而且,这仅适用于您在本地跟踪的那些)。一些 cmets 指出,您可以使用可以在本地跟踪所有远程分支的 shell 脚本解析 git branch -a 结果。总结:没有 git 原生的方式来做你想做的事,无论如何这可能不是一个好主意。
  • 也许只是用老式的方式复制整个文件夹? scp some_user@example.com:/home/some_user/project_folder ~ 不确定该解决方案是否适用于 github..
  • 与其说“我已经克隆、拉取和获取”,不如向我们展示您执行的确切命令
  • 它总是让我感到困惑,为什么“克隆”不是一个精确的副本。如果它是一个精确的克隆,不应该所有的分支都是本地存储库的一部分吗?我的意思是这不是分发的重点之一吗?因此,当某个存储库消失时,您仍然拥有所有内容的完整副本。还是所谓的“远程”真的是本地存储库的一部分?
  • 看到所有的赞成票、答案、答案中的 cmets 以及令人难以置信的视图数量,我认为是时候 git 添加一个命令来执行此操作了。没错,你就是@huggie,正是我的想法。

标签: git git-branch git-clone remote-branch


【解决方案1】:

我正在从 Udemy 课程 Elegant Automation Frameworks with Python and Pytest 中克隆一个存储库,以便以后可以离线查看它。我尝试下载 zip,但这仅适用于当前分支,所以这是我的 2 美分。

我在 Windows 上工作,显然,我从 Windows Subsystem for Linux 求助于 Ubuntu shell。克隆后,这是我的分支:

$ git clone https://github.com/BrandonBlair/elegantframeworks.git

$ git branch -a

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/config_recipe
  remotes/origin/functionaltests
  remotes/origin/master
  remotes/origin/parallel
  remotes/origin/parametrize
  remotes/origin/parametrize_data_excel
  remotes/origin/unittesting
  remotes/origin/unittesting1

然后——在打了几堵git checkout 砖墙之后——最终对我有用的是:

$ for b in `git branch -a | cut -c18- | cut -d\  -f1`; do git checkout $b; git stash; done

在此之后,这是我的分支:

$ git branch -a

  config_recipe
  functionaltests
  master
  parallel
  parametrize
  parametrize_data_excel
  unittesting
* unittesting1
  remotes/origin/HEAD -> origin/master
  remotes/origin/config_recipe
  remotes/origin/functionaltests
  remotes/origin/master
  remotes/origin/parallel
  remotes/origin/parametrize
  remotes/origin/parametrize_data_excel
  remotes/origin/unittesting
  remotes/origin/unittesting1

我的是物理的,删除初始的 remotes/origin/,然后过滤空格分隔符。可以说,我可以把 grep 换掉 HEAD 并完成一个 cut,但我会把它留给 cmets。

请注意,您当前的分支现在是列表中的最后一个。如果你不知道为什么会这样,那么你就处于困境中。只需git checkout 随心所欲。

【讨论】:

    【解决方案2】:

    要创建存储在 git 主机 (github/bitbucket/etc) 中的所有分支+refs+tags+etc 的“完整”备份,请运行:

    mkdir -p -- myapp-mirror
    cd myapp-mirror
    git clone --mirror https://git.myco.com/mygroup/myapp.git .git
    git config --bool core.bare false
    git config --bool core.logAllRefUpdates true
    git reset --hard # restore working directory
    

    这是根据我从其他答案中学到的所有内容编译而成的。

    然后您可以使用此本地 repo 镜像转换到不同的 SCM 系统,或者您可以将其保留为备份。它作为搜索工具也很有用,因为大多数 git 主机只搜索每个 repo 的“主”分支上的代码。

    【讨论】:

    • git reset --hard 看起来很吓人。这一切应该做什么?一个解释将是有序的。例如,想法/要点是什么?请通过编辑您的答案来回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来好像是今天写的)。
    • 因为这是一个全新的克隆目录,我看不出它有多可怕。
    【解决方案3】:

    这是一个改编自之前答案的跨平台 PowerShell 7 函数。

    function Invoke-GitCloneAll($url) {
        $repo = $url.Split('/')[-1].Replace('.git', '')
        $repo_d = Join-Path $pwd $repo
        if (Test-Path $repo_d) {
            Write-Error "fatal: destination path '$repo_d' already exists and is not an empty directory." -ErrorAction Continue
        } else {
            Write-Host "`nCloning all branches of $repo..."
            git -c fetch.prune=false clone $url -q --progress &&
            git -c fetch.prune=false --git-dir="$(Join-Path $repo_d '.git')" --work-tree="$repo_d" pull --all
            Write-Host "" #newline
        }
    }
    

    注意: -c fetch.prune=false 使其包含通常会被排除的陈旧分支。如果您对此不感兴趣,请删除它。


    您可以通过从函数中删除 && 来使其与 PowerShell 5.1(Windows 10 中的默认设置)一起使用,但这会使其尝试使用 git pull,即使之前的命令失败。所以,我强烈建议您只使用跨平台的 PowerShell,它总是让您烦恼。

    【讨论】:

      【解决方案4】:

      对于使用Visual Studio Code 的开发人员来说,一个更好的替代解决方案是使用Git Shadow Extension

      此 Visual Studio Code 扩展允许克隆存储库内容和目录,可以按分支名称或提交哈希进行过滤。这样,分支或提交就可以用作新项目的样板/模板。

      【讨论】:

        【解决方案5】:

        如果您使用 Bitbucket,则可以使用 import Repository。这将导入所有 Git 历史记录(所有分支和提交)。

        【讨论】:

        • “存储库”是字面的吗?在什么情况下使用“导入存储库”?在网络界面中?或者是其他东西?你能详细说明一下吗?
        【解决方案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
        

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

        【解决方案7】:

        我编写了这些小的 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 repository找到。

        【讨论】:

          【解决方案8】:

          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
          

          疑难解答

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

          • 仔细检查您的遥控器 (git remote -v),例如
            • 验证 git config branch.master.remoteorigin
            • 检查origin 是否通过git remote show origin 指向正确的URL(参见this post)。

          【讨论】:

            【解决方案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 CommandFetch CommandCheckout Command

            【讨论】:

              【解决方案10】:

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

              当你克隆一个仓库时,实际上是下载了所有分支的信息,但是分支是隐藏的。用命令

              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”命令查看。

              2。第二步

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

              git config --bool core.bare false
              

              3。第三步

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

              git reset --hard
              

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

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

              【讨论】:

              • 我不喜欢您在...中使用“下载”一词一次手动“下载”它们。事实上,所有信息都在克隆存储库后已经下载。唯一需要做的就是创建本地跟踪分支(离线时也可以,证明所有信息都在repo中)。
              • @bvgheluwe 这就是它在引号中的原因。
              【解决方案11】:

              查看问题的答案之一,我注意到可以缩短它:

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

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

              【讨论】:

              • 您可以改进正则表达式,或者使用 Awk 代替 grep,以改进过滤器以避免误报。
              • 所有的分支都是'origin\my_branch_name',这绝对不是我想要的。
              • 我之前没有见过 ${branch##*/} 这个结构 - 看起来真的很有用 - 知道在哪里可以找到更多相关信息吗?似乎在 bash 下的任何地方都找不到。谢谢。
              【解决方案12】:

              除了user nobody is on the right track,这些答案都没有。

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

              所以我发现这两种方法非常很有用。

              方法一:

              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
              

              方法二:

              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
              

              【讨论】:

                【解决方案13】:

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

                git clone <your_http_url>
                

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

                git branch -a
                

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

                git checkout <your_branch_name>
                

                不用担心“git clone”之后就不需要连接远程仓库了。 “git branch -a”和“git checkout ”可以在没有网络连接的情况下成功运行。所以证明当你做“git clone”时,它已经从远程仓库复制了所有的分支。之后,您不需要远程存储库。您的本地已经拥有所有分支机构的代码。

                【讨论】:

                • 这里的回复非常明确。很多人对这个话题感到困惑。
                • 我想支持您的声明“关闭wifi时可以成功运行”。 “git clone”确实会生成一个包含所有分支的仓库。
                【解决方案14】:

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

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

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

                git checkout --track origin/&lt;branch you want to checkout&gt;

                通过以下命令验证你是否在想要的分支中;

                git branch
                

                输出会是这样的;

                *your current branch
                some branch2
                some branch3
                

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

                【讨论】:

                • 谢谢 suraj。原因是它没有被太多投票。并且提问者不接受答案。
                • “git fetch origin”没有将任何远程分支带到我的本地 - 或者它们隐藏在某个地方?看了上面所有的答案让我很头疼。我们正在寻找“git fetch all branch to local”。除了 bash 脚本之外,必须有其他方法可以做到这一点。
                • 在你执行“git fetch origin”之后,它会在你的终端中显示这样的输出 - “* [new branch] branch_name -> origin/branch_name”,但是当你运行“git branch”时“它只会向您显示您的本地分支,因此要查看您可以执行的所有分支“git branch -a”,然后切换到您需要运行的远程分支“ git checkout --track origin/”。希望这可以帮助。 :-)
                • Suraj,因为问题是,如何“克隆所有远程分支”——而不是如何一次手动更新一个。实际问题似乎没有答案 - 如果您有很多分支,只是进行大量打字的方法。
                【解决方案15】:

                复制粘贴到命令行:

                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. 遍历遥控器的所有分支,除了 master 和 HEAD 0. 删除本地分支(以便我们可以检查强制更新的分支) 0. 签出远程分支
                4. 签出大师(为了它)

                它基于VonCthe answer

                【讨论】:

                  【解决方案16】:

                  我试图找出如何拉下我在本地删除的远程分支。 Origin 不是我的,我不想经历重新克隆所有东西的麻烦。

                  这对我有用:

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

                  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
                  

                  【讨论】:

                    【解决方案17】:

                    这是最好的方法:

                    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”在给定的命令列表中不存在。
                    • 取自 Dave 下面的回答。使用 'git config --bool core.bare false' 而不是 'git config unset core.bare' 似乎可以完成这项工作。
                    • 实际上是git config --unset core.bare...对我来说,这似乎是此处答案中提供的所有解决方案中最干净的解决方案。可惜点赞太少了……
                    • 谢谢@ChrisSim 我同意git config --bool core.bare false。这就是我推荐Dave's answer 的原因。你觉得Dave's answer怎么样?干杯
                    • 绝对是最好的答案,除了@FedericoCapaldo gave an answer 更详细地说明了这些命令的作用。
                    【解决方案18】:

                    我认为这可以解决问题:

                    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
                    

                    到目前为止,这对我有用。

                    【讨论】:

                    • 根据git fetch (kernel.org/pub/software/scm/git/docs/git-fetch.html)的refspec部分下的注释#2,这可能需要调整。
                    • 你的意思是开头的注释,“你永远不会在出现在 冒号右侧的分支上进行自己的开发”?而且,调整的原因是什么?
                    • @MarkDBlackwell,不知道我当时的意思..说实话。
                    【解决方案19】:

                    这样做:

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

                    【讨论】:

                      【解决方案20】:

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

                      git pull --all
                      

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


                      注意:这不会创建任何未签出分支的工作副本,这正是问题所在。为此,请参阅

                      【讨论】:

                      • 如果我做 git clone,我有本地的 master 分支和 10 个“远程”的分支。所以 Gabe 的这个回答非常有帮助并且回答了这个问题。
                      • 这只获取本地添加的远程分支,而不是任何远程分支
                      • 第一个命令是多余的。只需git pull --all 也会这样做——它不会获取两次。并且 infosec812 是正确的,这无论如何都不能回答这个问题。我想知道这是怎么得到这么多赞成票的。
                      • 这根本没有帮助,除了现有的分支之外,不会拉取任何远程分支。
                      • 这不是第一次简单地错误的答案因为它没有回答问题而得到数百个不理解问题和/或回答,或由谷歌登陆以搜索原始 OPs 问题以外的其他内容,而这样的“答案”意外地回答了他们的问题。不幸的是,没有有效的答案标志不回答问题,唯一的方法是投票,这在某些情况下显然不起作用,所以这种噪音将永远存在:(
                      【解决方案21】:

                      关于,

                      git checkout -b 实验起源/实验

                      使用

                      git checkout -t origin/experimental
                      

                      或者更冗长,但更容易记住

                      git checkout --track origin/experimental
                      

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

                      【讨论】:

                      • 所以你的意思是第二种形式只是更容易记住,没有其他区别?
                      【解决方案22】:

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

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

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

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

                      注意这是alpha software ;-)

                      这是运行 grb help 时的帮助:

                      git_remote_branch 版本 0.2.6 用法: grb create branch_name [origin_server] grb 发布分支名称 [origin_server] grb 重命名 branch_name [origin_server] grb 删除分支名称 [origin_server] grb 跟踪分支名称 [origin_server] 笔记: - 如果未指定 origin_server,则假定名称为“origin” (git的默认值) - 重命名功能重命名当前分支 解释元命令:您还可以在任何命令前面加上 关键字“解释”。而不是执行命令, git_remote_branch 将简单地输出您需要运行以完成的命令列表 那个目标。 例子: grb 解释创建 grb 解释创建 my_branch github 所有命令也有别名: 创造:创造,新的 删除:删除,销毁,杀死,删除,rm 发布:发布,远程化 重命名:重命名,rn,mv,移动 跟踪:跟踪,跟随,抓取,获取

                      【讨论】:

                      • 智者的话:看起来这个项目在发布这个答案的时候就被放弃了。我在 2008 年之后找不到任何更新。警告购买者和所有这些。如果我错了,我希望有人能编辑并提供一个当前指针,因为我希望有这样一个方便的工具。
                      • @bradheintz 检查这个答案,它设置了一个 git 别名:stackoverflow.com/a/16563327/151841
                      【解决方案23】:

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

                      【讨论】:

                      • 这里不需要 refs/remotes。 git checkout -b dev origin/dev 可以正常工作。
                      • 这将始终有效:git checkout -b newlocaldev --track origin/dev。如果您希望本地分支与远程分支具有相同的名称,并且远程分支没有棘手的名称,您可以省略-b newlocaldev。使用默认的branch.autosetupmerge 配置设置,并假设您没有名为dev 的本地分支,这两个命令可能会做同样的事情:git checkout -b dev origin/dev 和普通的git checkout dev。最后,git checkout origin/dev 不会创建新的分支,只是将您置于分离的 HEAD 状态。
                      • 当远程不再存在但 Git 太愚蠢以至于无法确认它已被删除时会发生什么?这假设您已更新并且git branch -a 继续将其列为远程分支。
                      • 我们为几十个分支机构这样做?
                      【解决方案24】:

                      自包含存储库

                      如果您正在寻找一个独立的克隆或备份,它包含所有远程分支和提交日志,请使用: p>

                      git clone http://user@repo.url
                      
                      git pull --all
                      

                      git branch -a 接受的答案仅显示远程分支。如果您尝试 checkout 分支,除非您仍然具有对原始服务器的网络访问权限,否则您将无法访问。

                      感谢: Gabe Kopley's 建议使用 git pull --all

                      注意:
                      当然,如果您不再具有对 remote/origin 服务器的网络访问权限,则 remote/origin branches 将不会在您的存储库克隆中反映任何更新。他们的修订将反映您执行上述两个存储库克隆命令的日期和时间的提交。


                      使用 `git checkout remote/origin/` 以通常的方式检出 *local* 分支 使用 `git branch -a` 显示保存在 `clone` 存储库中的远程分支。

                      要使用一个命令将所有 clone 分支检出到 本地分支,请使用以下 bash 命令之一:

                      $ for i in $(git branch -a |grep 'remotes' | awk -F/ '{print $3}' \ 
                      | grep -v 'HEAD ->');do git checkout -b $i --track origin/$i; done
                      

                      如果你的仓库有嵌套分支,那么这个命令也会考虑到这一点:

                      for i in $(git branch -a |grep 'remotes' |grep -v 'HEAD ->');do \
                      basename ${i##\./} | xargs -I {} git checkout -b {} --track origin/{}; done
                      

                      上面的命令将checkout一个本地分支进入你的本地git仓库,命名与remote/origin/&lt;branchname&gt;相同,并将其设置为--track从远程分支上更改remote/origin 服务器是否应该再次重新获得对原始 repo 服务器的网络访问权限并以通常的方式执行 git pull 命令。

                      【讨论】:

                      • 这就是我来找她的目的!
                      【解决方案25】:

                      对远程仓库进行裸克隆,将内容保存到 .git 目录

                      git clone --bare remote-repo-url.git localdirname/.git
                      

                      (使用 git clone --bare 或 git init --bare 创建的裸 git 存储库是一个存储库,它没有工作目录,您不能在那里创建或修改文件。)

                      将目录更改为本地目录

                      cd localdirname
                      

                      使您的 git 存储库可修改

                      git config --bool core.bare false
                      

                      恢复你的工作目录

                      git reset --hard
                      

                      列出你所有的分支

                      git branch -al
                      

                      【讨论】:

                        【解决方案26】:

                        每当我需要关闭所有分支时,我都会这样做。 Ray Villalobos 来自 Linkedin Learning。尝试克隆所有分支,包括提交:

                        mkdir -p -- newproject_folder
                        cd newproject_folder
                        git clone --mirror https://github.com/USER_NAME/RepositoryName.git .git
                        git config --bool core.bare false
                        git reset --hard
                        

                        【讨论】:

                        • 几个月后,如何使用所有最新更改更新此镜像?
                        • 如果我理解这一点,似乎git remote update 显然会给你一个“新鲜”的镜子。我认为它也可能反映在远程仓库上完成的清理工作。因此,如果 refs/branches/tags/etc 被远程删除,它将在本地删除它们。但是,我不能 100% 确定。
                        【解决方案27】:

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

                        【讨论】:

                        • 所以,如果你checkout的分支名称和远程分支的名称相同,“/”后面的所有内容,那么git会创建一个同名的分支,所有内容在“/”之后,“跟踪”那个远程?通过跟踪,我们的意思是:git pushgit pull 等将在那个遥控器上完成?如果这是正确的,那么用更多信息扩展你的答案,因为我同意@Daniel,这个答案值得更多的代表。
                        • @BullfrogBlues,您所有问题的答案似乎都是肯定的(我使用的是 git v1.7.7.4)。我同意应该更好地了解这种行为。 (这个版本的 git 的手册中没有。)我实际上不喜欢这种行为,我宁愿得到一个错误,并且必须明确地说 git checkout --track origin/somebranch
                        • @dubiousjim:实际上,这在手册中。 git-checkout(1) 说:“如果 未找到,但在一个远程(称为 )中确实存在一个具有匹配名称的跟踪分支,则视为等效于 'git checkout -b --track /' " (Git V.1.8.1.1)。
                        • 我们需要的是 $ git pull * /* - 其中“*”是一个通配符,所以它会拉取所有分支,包括那些尚未在本地系统上的分支。这个怎么做?我们真的应该签出/拉取每个分支只是为了将代码拉到我们的本地系统吗?
                        • 对我来说最重要的是,如果它不存在,它就不会创建一个。
                        【解决方案28】:

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

                        这里,“新分支”仅仅意味着分支取自索引并为您在本地创建。正如 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 &
                        

                        【讨论】:

                        • 如何自动创建所有远程分支,例如实验性的起源/实验性?
                        • Cristian:我过去总是为每个分支 'origin/foo' 创建一个分支 'foo',但这导致了两个问题:(1) 我最终得到了很多非常陈旧的跟踪分支,这些分支在相应的远程分支后面有很多提交,并且 (2) 在旧版本的 git 中,运行“git push”会尝试将我所有的本地分支推送到远程,即使这些分支已经过时。所以现在我只为我正在积极开发的东西保留本地分支,如果我需要有关它们的信息,则直接访问 origin/* 分支。 (也就是说,您可以使用 shell 脚本来解析 'git branch -a'。)
                        • "git fetch " 在本地为你带来分支。
                        • 很好的答案,但有点错过了这个问题。我正在寻找一个单线来检查所有远程分支机构。
                        • 问题是关于克隆所有远程分支,而不是检查它们。而且,正如我上面提到的,你真的不想创建任何不必要的本地跟踪分支,因为当它们变得非常陈旧时,它们可能会让人头疼。
                        【解决方案29】:

                        这个解决方案让我可以将一个存储库“复制”到另一个存储库:

                        git merge path/to/source.git --mirror
                        cd source.git
                        git remote remove origin
                        git remote add origin path/to/target.git
                        git push origin --all
                        git push origin --tags
                        

                        在目标存储库上,我可以看到与原始存储库相同的分支和标签。

                        【讨论】:

                          【解决方案30】:

                          在这里,我给你写了一个很好的函数,让它很容易重复

                          gitCloneAllBranches() { # clone all git branches at once easily and cd in
                            # clone as "bare repo"
                            git clone --mirror $1
                            # rename without .git extension
                            with_extension=$(basename $1)
                            without_extension=$(echo $with_extension | sed 's/.git//')
                            mv $with_extension $without_extension
                            cd $without_extension
                            # change from "bare repository" to not
                            git config --bool core.bare false
                            # check if still bare repository if so
                            if [[ $(git rev-parse --is-bare-repository) == false ]]; then
                              echo "ready to go"
                            else
                              echo "WARNING: STILL BARE GIT REPOSITORY"
                            fi
                            # EXAMPLES:
                            # gitCloneAllBranches https://github.com/something/something.git
                          }
                          

                          【讨论】:

                          猜你喜欢
                          • 2016-05-02
                          • 2021-10-08
                          • 2011-07-30
                          • 1970-01-01
                          • 2011-02-02
                          • 2021-03-07
                          • 2019-10-30
                          • 2021-06-26
                          相关资源
                          最近更新 更多