repo:从零开始搭建repo环境
概要
- 简单来说,repo是git仓库的管理工具,它能更方便的管理由若干个git仓库组成的项目。
- 它是python脚本,平常我们操作的repo命令只是一个入口,其实它还有一个git仓库,是一系列python脚本的集合
- repo通过清单文件(.xml)来管理。清单文件里记录了所有的git仓库信息。也可以当作是项目的快照,根据某一个清单文件,就能将整个项目里的所有git仓库都还原到生成清单文件时的状态。所有的清单需要一个git仓库管理
一、准备工作
1、repo的源码:不仅仅是repo命令那一个脚本,而是repo的源码库,源码库中也会有repo命令。提供一下,仅供参考
- 我自己的:https://github.com/newbie-plan/git-repo
- 清华大学的:https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/
ps:其实我也是从清华大学里下载下来的,然后建一个自己的repo源码库。谷歌的就不放了,很难下的下来
2、清单库:自己建一个叫manifest名字的git库,用来存放清单文件就可以。注意,必须至少有一个清单文件,这样才能根据清单文件拉代码,之后也才能生成新的清单文件。提供一下,仅供参考
- manifest库:https://github.com/newbie-plan/manifest
ps:其实就是xml文件,掌握基本语法之后根据自己的项目写一个就可以了
二、搭建
1、repo源码库:一个git仓库。将之前准备好的repo源码建成一个git库,注意以下几点就可以了
- repo默认是找stable分支,所以最简单的就是建一个stable分支,将准备好的repo源码提交到stable分支上。当然也可以提交到任意分支上,然后每次初始化时都用 –repo-branch 指定,或者改一下repo命令,让它默认找某个分支
- 确定初始化使用的分支之后,针对该分支最新的提交,新建一个tag并提交到远端仓库。因为repo会根据分支的commit查找tag
- 该tag必须使用gpg加密(怎么生成秘钥自行百度),因为找到tag之后repo会用gpg解密。公钥写在repo命令中。所以,没错,需要改repo脚本,将公钥写进去,这个后面再说
2、manifest库:一个git仓库。里面有写好的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="ssh://git@github.com/newbie-plan" name="origin"/>
<project name="vmix.git" path="vmixlocal" remote="origin" revision="main" up
<project name="amix.git" path="amixlocal" remote="origin" revision="main" up
</manifest>
- remote标签里的fetch,如果不带ssh://前缀,那就会默认添加manifest的url
<remote fetch="git@github.com:newbie-plan" name="origin"/>
实际上
fetch = git@github.com:newbie-plan/manifest.git/git@github.com:newbie-plan
<remote fetch="/" name="origin"/>
实际上
fetch = git@github.com:newbie-plan/manifest.git
<remote fetch="../" name="origin"/>
实际上
fetch = git@github.com:newbie-plan/
- project标签中的name是git仓库url减去fetch剩余的部分。所以实际上我是要拉这个仓库的代码
ssh://git@github.com/newbie-plan/vmix.git
3、往repo脚本中添加gpg公钥
- 添加公钥的地方
- repo脚本原本就有一个公钥,跟在后面添加自己的就可以了
- Repo Maintainer repo@android.kernel.org 是秘钥id。就是生成gpg秘钥时输入的名字
- BEGIN - END中间的就是公钥,导出后完整拷贝过来就可以了
- 所以这个repo脚本文件就和repo源码库对应了,因为repo源码库中的tag是gpg私钥加密的,只有这个repo文件中有gpg公钥可以解密。所以可以替换repo源码库中的repo脚本文件
4、举个栗子
- 我的repo库:git@github.com:newbie-plan/git-repo.git
- 我的manifest库:git@github.com:newbie-plan/manifest.git,里面有一个default.xml
- 所以在本地初始化repo命令是
repo init --repo-url=git@github.com:newbie-plan/git-repo.git -u git@github.com:newbie-plan/manifest.git -m default.xml
三、可能遇到的错误
-
python版本不对
我下载的repo源码可能比较新,要求是python3.5以上,其实必须要3.6以上,因为有用到python3.6新增的语法 f-Strings -
git版本不对
如上图可以看到,脚本执行了git ls-remote命令,带着三个选项。但是我的git ls-remote
根本就没有–symref选项,所以遇到这个问题,升级git版本。或者跟我一样,改repo源码,去
掉或换掉–symref选项
四、最后
- 基本上我就是这样在debian8.9上搭建出来的,可能环境不一样,遇到的问题不一样,这个只能到时候根据报错来解决了
- 全当记录一下,万一后面真需要呢