Windows上安装使用repo

Manifest和Repo

当一个项目的体量发展庞大时,单个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文件可以如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<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

成功的话就可以成功拿到所有代码啦。

参考:Windows安装repo的真正解决方案 (juejin.cn)


本文为原创内容,遵循CC BY-ND 4.0协议,署名-禁止演绎。
转载请注明出处:https://tis.ac.cn/blog/yexin/windows%e4%b8%8a%e5%ae%89%e8%a3%85%e4%bd%bf%e7%94%a8repo/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注