当一个项目的体量发展庞大时,单个git仓显然已经满足不了开发人员的需求,这时需要将项目划分为多个git仓库进行管理。最先这么做并且取得成功的当属Android项目。Android开发了 repo 命令行工具来管理多个git项目。repo实际上使用了python
指令对 git
命令进行封装,将百多个git库有效的进行组织管理。当源码仓库数量庞大时,使用git
进行管理会带来很多不便,这里repo
就体现了其优越性。
repo需要一个manifest XML文件来指示这些git项目的属性。
Windows10上安装repo
安装git
安装最新的git for windows,笔者安装的是Git-2.32.0-64-bit.exe。配置环境变量。一般安装完成会自动配置环境变量。
安装python3
python3进行安装。Python 3在安装的时候勾选Add path会自动配置环境变量。笔者安装的是python-3.9.5-amd64.exe。
在线安装repo
下载repo配置文件
在任意位置打开git-bash,逐条输入如下指令:
mkdir ~/bin #进入C:Userusename目录
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+rx ~/bin/repo
下载最新的repo工具源码
# 先随便新建源码目录
mkdir -p ~/AOSP/.repo
cd ~/AOSP/.repo
# clone工具集
git clone https://gerrit.googlesource.com/git-repo
# 改文件夹名
mv git-repo repo
# 回到AOSP源码目录
cd ..
# 需要使用管理员身份运行:初始化repo仓,成功
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r25 --worktree
修改REPO_URL
由于墙的原因,有的仓库会在repo init时失败,这时就需要改变REPO_URL为清华镜像源。
打开~/bin/repo文件:
# repo default configuration # REPO_URL = os.environ.get('REPO_URL', None) if not REPO_URL: #REPO_URL = 'https://gerrit.googlesource.com/git-repo' REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/' #修改为清华镜像源 REPO_REV = os.environ.get('REPO_REV')
建立manifest
一般地,在gitlab的一个组下会有一个manifest项目,该项目下可以存放不同的XML文件来指示这些git项目的属性。默认的XML文件为default.xml。
一个简单的manifest XML文件可以如下所示:
<manifest>
<remote fetch="https://gitlab.com/autocore_publish/mpu/" name="origin" />
<default remote="origin" revision="master" sync-j="4" />
<remote name="github" fetch="https://github.com/" />
<project name="flexbuild" path="flexbuild"/>
<project name="ramdiskrfs" path="flexbuild/packages/rfs/ramdiskrfs" revision="master" />
<project name="krb5/krb5" path="flexbuild/packages/apps/openssl/krb5" remote="github" revision="b9ad6c49505c96a088326b62a52568e3484f2168" />
</manifest>
remote部分
fetch:远端仓库器地址,一般是manifest仓库所在的地址下;
name:默认的remote name,就是git push origin里面那个origin。
default部分
default部分定义了默认的remote和revision,当project中未定义remote和revision时,就使用default中定义的默认remote和revision。
project部分
name:git仓库在服务器上的相对于manifest文件夹的路径;
path:把代码下载下来后在本地的相对路径,如果省略那么就认为path和name一样;
revision:下载下来的代码要checkout到哪个revision上,这里的revision可以是commit id、branch name、tag name,反正本质上都是commit id(因为branch name实际上也是该分支上HEAD的commit id)。
repo命令
repo help
#repo help command #获取指令的帮助 repo help sync #获取repo sync命令的帮助
repo init
在当前目录中安装repo。
repo init -u URL [options]
-u:必选,manifest仓库的URL;
-b:指定init manifest仓库的哪个分支;
-m:选择manifest仓库中的XML文件,默认为default.xml。
如:repo init -u https://gitlab.com/XXX/manifest -b mani-test
指初始化https://gitlab.com/XXX/manifest仓库中mani-test分支下的default.xml。
这一步执行成功的话,会在执行路径下生成一个.repo文件夹,此时还没有拉下代码,.repo文件夹目录如下:
- .repo
- manifests #这个就是下载的manifest仓库
- .git
- default.xml
- manifests.git
- repo
- manifest.xml
如果执行失败,则不会有manifest.xml。manifest.xml是一个指向.repo/manifests/目录中所选XML的链接。只有存在manifest.xml才能够执行repo sync。
用户可以修改default.xml,控制同步代码时同步或者不同步哪些仓库。
注意:对于其他的repo命令,当前工作目录必须是.repo/的父目录或其父目录的子目录。
repo sync
与远端代码同步,在未使用任何参数的情况下运行repo sync
,会同步所有项目的文件。
repo sync [project-list]
-
如果项目从未同步过,则
repo sync
相当于git clone
-
如果项目不是第一次同步,则repo sync相当于:
$ git remote update
$ git rebase origin branch
这就意味着,repo sync有可能会出现冲突。当出现冲突时,就按照git rebase解冲突的步骤操作即可。
以下是一些比较常用的命令选项:
-c:仅获取选定的manifest XML中规定要更新的分支;
-d:将指定项目切换回选定的manifest XML修订版本;
-f:即使某个项目同步失败,也继续同步其他项目;
-jthreadcount:-j后面紧跟一个线程数量(没有空格),将同步操作拆分成多个线程,以更快完成同步;
-q:安静模式。
repo start
从manifest XML文件中指定的revision为基础,批量为多个仓库创建本地分支。
repo start branch_name project_list
为project_list中罗列的项目统一创建本地分支branch_name。项目名称以空格隔开。
repo测试实例
在gitlab上新建manifest项目
在gitlab上的一个群组下,新建manifest项目,用于repo管理这个群组下的若干个git仓库。
该示例为manifest管理父目录pilot群组下的所有git仓库——drivers和common。
- pilot - drivers - camera - lidar - manifest -default.xml - common - msgs
克隆仓库,切换到自己的分支,新建一个default.xml:
git clone https://gitlab.com/XXX/pilot/manifest git checkout -b yx
default.xml的代码如下:
<manifest>
<remote fetch="https://gitlab.com/XXX/pilot" name="origin" />
<default remote="origin" revision="main" sync-j="4" />
<!-- drivers -->
<project name="drivers" path="drivers"/>
<!-- common -->
<project name="common" path="common"/>
</manifest>
在提交XML之前,最好先在在线XML格式验证网站上验证一下XML格式是否有误,否则repo init的时候会报错default.xml格式有误:
$ repo init -u https://gitlab.com/XXX/pilot/manifest -b yx Downloading manifest from https://gitlab.com/autocore/odd/acpilot/manifest fatal: manifest 'default.xml' not available fatal: error parsing manifest E:/code/pilottest/.repo/manifestsdefault.xml: not well-formed (invalid token): line 56, column 79 Downloading Repo source from https://gerrit.googlesource.com/git-repo
提交代码git push origin yx;
然后测试是否能够repo init和repo sync,测试步骤如下:
#以管理员身份打开git-bash mkdir /e/test cd /e/test repo init -u https://gitlab.com/XXX/manifest -b yx repo sync -j8 -c
成功的话就可以成功拿到所有代码啦。
参考: