0x00 前言
该说点什么好呢,看到这个系列的第一篇的时间戳,已经是2年前了,生活总是这样要温故知新。安卓的项目已经从30个G变成了40多G,完全就是一个monstor一样的进化过程,不得不承认,能维护这么庞大的开源代码,是一件很不可思议的事情。
前一段时间微软宣布放弃edge浏览器内核的开发,准备启用chrome内核,一方面说明浏览器的复杂程度已经超出了自己预期成本,另一方面体现了开源项目的生命力。
0x01 repo工具
需求:在一个项目中包含了很多git仓库,一旦想更新代码,岂不是要到每个git目录下分别pull一遍代码?
当然,快捷的方式是写一个shell脚本,一键pull多个仓库。
repo就是这样的增强版工具。Google使用Python脚本统一管理多个git仓库,用于下载,回退版本等操作。
0x02 安装repo
工具比较小,而且没啥更新,直接用国内的即可。
创建工具所在bin目录
mkdir ~/bin
向zsh导入执行路径
比较习惯使用oh-my-zsh,所以需到在~/.zshrc中添加一句
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
# Path to your oh-my-zsh installation.
export ZSH="/home/counsellor/.oh-my-zsh"
export PATH=~/bin:$PATH # 这句是自己加的
下载repo
国内下载地址(推荐)
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
异世界下载地址
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
增加执行权限
chmod a+x ~/bin/repo
0x03 repo init
repo init的过程主要是下载一堆manifest配置文件,项目的remote url,项目包含的所有git仓库的地址,项目的版本等等。
建立工作目录
mkdir aosp
cd aosp
初始化仓库
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
如果需要某个特定的 Android 版本(列表):
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r30
真 · 初始化
repo init --depth=1 -u https://aosp.tuna.tsinghua.edu.cn/platform/manifestt -b android-9.0.0_r30
--depth=1
表示只下载最近版本的代码,只保留最近的commit版本。
使用--depth
可以节省本地磁盘空间,加速下载,对于开发够用了。
0x04 repo sync
他喵的,我初始化的时候指定了android -4的版本,结果发现同步过程有android-9.0.0的日志,down了3天3夜,140多G还没有同步完,眼泪哗哗的。
同步命令
repo sync
多线程并发同步
特步 - 飞一般的感觉
repo sync -j`nproc`
-j
参数指定同时运行多少个job,nproc
是当前计算机的处理单元个数
这个命令的完整意思就是,开足马力,带你飞。
真 · 同步
repo sync -c -f --no-tags --no-clone-bundle -j`nproc`
-c
或者--current-branch
表示只拉取当前分支代码,坑爹啊,我在init指定了分支,同步的时候,你却悄悄给我拉些没用的。
--no-tags
不拉取tags,tag虽然不大,但架不住多
--no-clone-bundle
不使用clone.bundle,clone.bundle是git bundle一样的打包文件,使用bundle文件可以做cdn下载的分流,cdn听上去不错,但是如果cdn到google的服务器,或者clone.bundle本来就占空间,不是很划算,所以不使用clone.bundle
-f
如果sync失败,继续同步(想想当年LZ写了一个while循环解决同步失败终止问题的)
--force-sync
如果文件目录有差异,强制覆盖掉
sync 失败的时候,就能想到-f
0x05 repo回滚
repo sync -d
可以将所有git 仓库的HEAD重置为manifest文件的指定版本。同时,处于暂存或者修改的目录变化不会被重置。
当然,-d
重置版本的妙用就是回滚,结合以下命令,可以让被指飞的git仓库门,全部恢复成干净的代码。
repo sync -d
repo forall -c 'git reset --hard' # Remove all working directory (and staged) changes.
repo forall -c 'git clean -f -d' # Clean untracked files
0x06 小结
- repo主要用到两个功能,一个是init项目,另一个是下载项目;
- AOSP项目本身很庞大,为了节约空间,尽量关注一个版本的代码比较好;
- repo的本质是git,所以是可以使用代理【传送门】下载asop的。
0x07 参考文献
https://github.com/zawzaww/aosp-android
https://blog.csdn.net/zerooffdate/article/details/79348925
https://blog.csdn.net/u012842255/article/details/68941379
https://stackoverflow.com/questions/23300245/what-to-do-about-curl-clone-bundle-error-on-aosp-repo-sync
https://blog.csdn.net/mmh19891113/article/details/78476580
http://www.mashangxue123.com/git/3727190879.html
https://www.git-tower.com/learn/git/faq/detached-head-when-checkout-commit