文章目录
- 背景说明
- 分析
- 演示
- 解决方法
- 1. 对于比较少分支的仓库--方法1
- 2. 对于比较少分支的仓库--方法2
- 3. 对于比较多分支的仓库
- 两种方法的比较
背景说明
git clone
默认只克隆github上面设置的默认分支,(如果没有修改,默认就是master分支),那如果需要把所有分支都克隆下来该怎么办呢?分析 我们最常用的克隆命令应该是这个:
git clone
;按照上面的理解,这个命令其实是下面命令的简写形式:
git clone -b master
。演示 我们实际操作下:以我的第一个仓库hello-world为例:https://github.com/yansheng836/hello-world.git (注:因为我可能会用该仓库做一些测试,如果你也使用该仓库进行尝试,部分内容可能会和我的截图不一致)
- 克隆仓库到本地,查看本地分支
文章图片
- 查看远程分支
文章图片
关键命令:
git branch dev origin/dev
,即新建一个本地分支来跟踪远程的某一分支,创建该分支后,远程分支内容已拉取到本地分支。(或者你可以直接用git checkout -b dev origin/dev
,创建分支,并切换到该分支)文章图片
该方法弊端:因为这方法每次只创建一个分支,如果远程有多个分支,需要多次执行命令,比较麻烦。
该方法优点:(与下面方法进行对比)命令简单易懂。
如针对这个仓库你需要执行两次类似命令:
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 url
是git 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命令高手勿嘲笑,可跳过)
- | 表示通道,即前面命令的输出是后面命令的输入。
for xxx in xxxs; do xxx; done
是shell的for循环语句。- 倒引号``表示里面的是命令。
- git branch -r 列出远程分支。
- grep -v – ‘->’ ,grep查找命令,-v 参数表示not grep ,即查找输入中的不含’->’ 的行。
- git branch -r | grep -v – ‘->’ ,合起来就是参看远程分支中除了含有’->’ 的分支。
文章图片
- $b 表示远程分支名,例如:origin/dev。
- ${b##origin/} 表示截取远程分支名中origin/后面的内容,例如:dev,以此当做本地分支。
- git branch --track ${b##origin/} $b,类似于方法1的
git branch dev origin/dev
,–track参数是默认的,不加亦可。
文章图片
查看所有分支(包括本地和远程仓库分支)
git branch --all
简写为git branch -a
文章图片
After that,【Git|如何使用Git克隆GitHub仓库的所有分支】该方法弊端:(相对而言)命令比较复杂。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 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
两种方法的比较 对于哪种方法比较好这个问题,需要你自己来回答!适合自己的才是合适的!
虽然我按照“分支数量多少来分”这种分类方式,但是这仅仅是我个人的推荐用法,没有什么正式的规则依据。
参考:
- git 从远程仓库获取所有分支:https://blog.csdn.net/wu1169668869/article/details/83345633
- How to clone all remote branches in Git?:https://stackoverflow.com/questions/67699/how-to-clone-all-remote-branches-in-git
- How to fetch all Git branches: https://stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches
- Make an existing Git branch track a remote branch?:https://stackoverflow.com/questions/520650/make-an-existing-git-branch-track-a-remote-branch
- grep -v、-e、-E:https://blog.csdn.net/shadow_zed/article/details/93888685
- shell中$(( )) 与( ) 还 有 ( ) 还有 ()还有{ }的区别:https://www.cnblogs.com/xunbu7/p/6187017.html
推荐阅读
- Linux|109 个实用 shell 脚本
- linux笔记|linux 常用命令汇总(面向面试)
- Linux|Linux--网络基础
- linux|apt update和apt upgrade命令 - 有什么区别()
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)
- linux|2022年云原生趋势
- Go|Docker后端部署详解(Go+Nginx)
- 开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)