Git|如何使用Git克隆GitHub仓库的所有分支


文章目录

  • 背景说明
    • 分析
    • 演示
  • 解决方法
    • 1. 对于比较少分支的仓库--方法1
    • 2. 对于比较少分支的仓库--方法2
    • 3. 对于比较多分支的仓库
  • 两种方法的比较

背景说明 git clone 默认只克隆github上面设置的默认分支,(如果没有修改,默认就是master分支),那如果需要把所有分支都克隆下来该怎么办呢?
分析 我们最常用的克隆命令应该是这个: git clone
按照上面的理解,这个命令其实是下面命令的简写形式:git clone -b master
演示 我们实际操作下:以我的第一个仓库hello-world为例:https://github.com/yansheng836/hello-world.git (注:因为我可能会用该仓库做一些测试,如果你也使用该仓库进行尝试,部分内容可能会和我的截图不一致)
  1. 克隆仓库到本地,查看本地分支
    Git|如何使用Git克隆GitHub仓库的所有分支
    文章图片
  2. 查看远程分支
    Git|如何使用Git克隆GitHub仓库的所有分支
    文章图片
解决方法 1. 对于比较少分支的仓库–方法1 思路:先查看远程分支,然后在本地创建和远程仓库同名的分支。
关键命令:git branch dev origin/dev,即新建一个本地分支来跟踪远程的某一分支,创建该分支后,远程分支内容已拉取到本地分支。(或者你可以直接用git checkout -b dev origin/dev,创建分支,并切换到该分支)
Git|如何使用Git克隆GitHub仓库的所有分支
文章图片

该方法弊端:因为这方法每次只创建一个分支,如果远程有多个分支,需要多次执行命令,比较麻烦。
该方法优点:(与下面方法进行对比)命令简单易懂。
如针对这个仓库你需要执行两次类似命令:
git branch readme origin/readme
git branch dev origin/dev
流程简单演示:
$ git clonehttps://github.com/yansheng836/hello-world.git # 要先进入仓库目录 $ cd hello-world $ git branch readme origin/readme

2. 对于比较少分支的仓库–方法2 思路:在前面的分析已经提到了git clone urlgit clone -b master url的缩写(假设没有在远程仓库修改默认分支),那么我们同样可以使用该命令下载其他分支的内容。
关键命令:git clone -b readme url:下载该仓库的readme分支的内容。
优缺点:同方法1。
流程简单演示:
$ git clonehttps://github.com/yansheng836/hello-world.git # 不用先进入仓库目录 $ git clone -b readme https://github.com/yansheng836/hello-world.git

3. 对于比较多分支的仓库 思路:了解到了方法1、2的弊端,我们可能就会想到:循环可以执行重复的类似的操作,也许我们可以通过循环解决这个问题!该方法就是循环使用方法1.
背景说明:使用类Unix系统的人很自然就想到了使用shell编程,使用Windows系统人都是使用git的客户端的命令行工具,虽然可能种类不一,但是都是基于Linux shell的;因为git就是Linux的创始人:林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds) 开发的(开发git的初衷是因为和之前的版本管理系统的合作伙伴SCM(源码管理工具)闹掰了,这是个有趣的故事,详情可了解:Linux为什么开发Git?)。以此可以说:Linux和Git本是一家,所以Linux 很多命令也可以在git bash中使用;git火起来也正是因为Linus把庞大的 Linux内核代码库 (目前仓库大小为:2.55GB)放到git中进行版本管理(另一个重要原因是因为分布式),以实际行动证明Git完全有能力去管理这种庞大的系统。
关键命令:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

命令简单解释:(Linux命令高手勿嘲笑,可跳过)
  1. | 表示通道,即前面命令的输出是后面命令的输入。
  2. for xxx in xxxs; do xxx; done是shell的for循环语句。
  3. 倒引号``表示里面的是命令。
  4. git branch -r 列出远程分支。
  5. grep -v – ‘->’ ,grep查找命令,-v 参数表示not grep ,即查找输入中的不含’->’ 的行。
  6. git branch -r | grep -v – ‘->’ ,合起来就是参看远程分支中除了含有’->’ 的分支。
    Git|如何使用Git克隆GitHub仓库的所有分支
    文章图片
  7. $b 表示远程分支名,例如:origin/dev。
  8. ${b##origin/} 表示截取远程分支名中origin/后面的内容,例如:dev,以此当做本地分支。
  9. git branch --track ${b##origin/} $b,类似于方法1的git branch dev origin/dev,–track参数是默认的,不加亦可。
演示:
Git|如何使用Git克隆GitHub仓库的所有分支
文章图片

查看所有分支(包括本地和远程仓库分支)git branch --all简写为git branch -a
Git|如何使用Git克隆GitHub仓库的所有分支
文章图片

After that, git fetch --all will update all local copies of remote branches.
Also, git pull --all will update your local tracking branches, but depending on your local commits and how the ‘merge’ configure option is set it might create a merge commit, fast-forward or fail.
【Git|如何使用Git克隆GitHub仓库的所有分支】该方法弊端:(相对而言)命令比较复杂。
该方法优点:不管有多少分支都可以自动创建。
或者也可以这样:
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

流程简单演示:
$ git clonehttps://github.com/yansheng836/hello-world.git # 要先进入仓库目录 $ cd hello-world $ for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

两种方法的比较 对于哪种方法比较好这个问题,需要你自己来回答!适合自己的才是合适的!
虽然我按照“分支数量多少来分”这种分类方式,但是这仅仅是我个人的推荐用法,没有什么正式的规则依据。
参考:
  1. git 从远程仓库获取所有分支:https://blog.csdn.net/wu1169668869/article/details/83345633
  2. How to clone all remote branches in Git?:https://stackoverflow.com/questions/67699/how-to-clone-all-remote-branches-in-git
  3. How to fetch all Git branches: https://stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches
  4. Make an existing Git branch track a remote branch?:https://stackoverflow.com/questions/520650/make-an-existing-git-branch-track-a-remote-branch
  5. grep -v、-e、-E:https://blog.csdn.net/shadow_zed/article/details/93888685
  6. shell中$(( )) 与( ) 还 有 ( ) 还有 ()还有{ }的区别:https://www.cnblogs.com/xunbu7/p/6187017.html

    推荐阅读