repo是什么
官方的定义:Repo是谷歌用python脚本写的调用git的一个脚本,可以实现管理多个git库。
Android的源代码使用Repo 命令行工具来管理多个git仓库,大概有百多个。要想克隆和管理百多个 Git 仓库,不是一件简单的事情。Repo 命令行工具对 Git 部分命令如clone、pull,push,分支切换等众多命令和操作动作进行封装,将百多个 Git 库有效的进行组织。
Linux下安装Repo
linux下的Repo安装稍简单些,兼容性较好。
curl http://android.git.kernel.org/repo >~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin
Windows下Repo安装
repo原本是谷歌搞的一个方便下载AOSP的工具基于git,但由于种种原因不能直接在Windows上使用,如果按照网上搜到的方法,安装会遇到不少问题。
repo安装失败
方法一(不成功):
mkdir ~/bin
curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo > ~/bin/repo
curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo.cmd > ~/bin/repo.cmd
chmod a+rx ~/bin/repo

方法二(不成功):使用的是国内清华镜像
mkdir ~/bin PATH=~/bin:$PATH curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo chmod a+x ~/bin/repo
下载完整的Repo文件:
git clone https://mirrors.tuna.tsinghua.edu.cn/git/git-repo

方法三(不成功):
打开github上的git-repo仓库,把仓库代码clone或者zip包下载下来:
https://github.com/esrlabs/git-repo

下载后的目录路径添加至环境变量,使用bash命令查看版本:
repo --version 是可以查看成功的;
但是使用repo init -u 功能就各种报错了:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r25

repo成功安装步骤
使用的是gitee网站的repo开源代码,步骤如下:
1.打开git bash,创建一个环境路径(并把该路径加到windows的环境变量中去):
mkdir ~/bin
2.配置环境变量

通过命令:curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo;下载引导脚本生产引导文件repo;该文件放置C:\Users\ZPC18-121\bin,所以环境变量是该路径;
3.Repo 引导命令安装:
(1)执行如下引导命令:
# python3 版本向下兼容,注意这里应该下载是 repo-py3,而不是 repo
# PS: 这里下载的 repo 只是一个引导脚本,需要后续 repo init 后才有完整功能
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo
# 赋予脚本可执行权限
chmod a+x ~/bin/repo

(2)查看源码的方法(可以克隆到其它路径查看源码,不然和引导文件名冲突了)
git clone https://gitee.com/oschina/repo.git


源码也有repo-py3(实测是不能直接使用的,还是要使用:curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/ 的方式生产引导文件)

4. 测试repo 是否下载配置成功:
命令:repo --version

5.安装 requests 依赖
# 安装 requests 依赖,如果跳过这一步,后续执行命令时会自动提示安装(不安装repo init会有问题) pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
到此,repo工具安装配置成功!!!
项目清单库 manifest创建
1.创建名为 manifest 的仓库(该仓库用于Repo 初始化与所有要管理的git仓库初次同步),并在仓库中创建一个 default.xml 文件作为 repo 初始化的依据 ;default.xml文件用例:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="gitee"
fetch="git@gitee.com:{namespace}"
autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
<default revision="master"
remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->
<project path="repo_test1" name="repo_test1" /> <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
<project path="repo_test2" name="repo_test2" />
</manifest>
以下为 repo init 初始化命令, 需要用 -u 参数来指定 manifest 的远程仓库地址:
repo init -u git@gitee.com:{namespace}/manifest.git
如我配置的manifest仓库及default.xml内容是:
【1】意思1:我的git服务器是地址是:"https://gitee.com/monkeyqiyu"
【2】意思2:通过 manifest 的git仓库:https://gitee.com/monkeyqiyu/manifest.git 中的default.xml引导文件来管理同服务器的两个git仓库(可以继续按格式添加其它名字的仓库):
default.xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="gitee"
fetch="https://gitee.com/monkeyqiyu"
autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
<default revision="master"
remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->
<project path="git_test" name="git_test" /> <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
<project path="git_test1" name="git_test1" />
</manifest>
先remote部分:
fetch是服务器地址,可以用“..”来代替;name是默认的remote name,就是git push origin里面那个origin;review是gerrit地址 (这点是我猜的,不确定)
name: 远程git服务器的名字,直接用于git fetch, git remote 等操作
alias: 远程git服务器的别名,如果指定了,则会覆盖name的设定。在一个manifest(可以理解为default.xml)中, name不能重名,但alias可以重名。
fetch: 所有projects的git URL 前缀
review: 指定Gerrit的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果。
default部分:
里面定义了默认的remote和revision。revision是指下载下来的代码要checkout到哪个revision上,这里的revision可以是commit id、branch name、tag name,反正本质上都是commit id。default.xml中通常用branch name做revision。而commit id和tag name就是固定的某个commit了。
default 元素中指定的属性:
revision:Git 分支的名字。如果 project 元素没有指定 revision 属性,那么就使用 default 元素的该属性。revision 属性的值可以是一个 git branch,git tag,也可以是一个 commit id。
sync-j:sync 的时候,并行工作的任务数。
sync-c:如果设置为 true,则在同步代码的时候,将只会同步 project 元素中 revision 属性中指定的分支。如果 project 元素没有指定 revision 属性,则使用 default 元素的 revision 属性。
sync_s: 如果设置为true,则会同步git的子项目
remote: 之前定义的某一个remote元素中name属性值,用于指定使用哪一个远程git服务器。
project部分:
这部分定义了整包代码由哪些git组成。name是git在服务器上的相对路径,path是把代码下载下来后在本地的相对路径,path是可以省略的,如果省略那么就认为path和name一样;
经常使用的属性:
name: 唯一的名字标识project,同时也用于生成git仓库的URL。格式如下:
r e m o t e f e t c h / {remote_fetch}/ remotefetch/{project_name}.git
path:可选的路径,该 指定git clone出来的代码存放在本地的子目录。如果没有指定,则以name作为子目录名。
remote: 指定之前在某个remote元素中的name。
revision:指定需要获取的git提交点,可以是master, refs/heads/master, tag或者SHA-1值。如果不设置的话,默认下载当前project,当前分支上的最新代码。
sync_c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
sync_s: 如果设置为true,则会同步git的子项目。
groups: 列出project所属的组,以空格或者逗号分隔多个组名。
upstream: 在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间。
a

最低0.47元/天 解锁文章
5973

被折叠的 条评论
为什么被折叠?



