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/repochmod a+x ~/bin/repoexport 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工具安装配置成功!!!
项目清单库创建
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仓库(可以继续按格式添加其它名字的仓库):
https://gitee.com/monkeyqiyu/git_test.git
https://gitee.com/monkeyqiyu/git_test1.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>
git服务器的manifest仓库:
Repo 初始化与仓库初次同步
1.创建一个本地文件夹作为工程目录,并进入该目录,执行repo初始化和仓库初次同步
mkdir your_project && cd your_project repo init -u git@gitee.com:{namespace}/manifest.git repo sync
执行:
mkdir myrepo&& cd myreporeposync
repo init -u https://gitee.com/monkeyqiyu/manifest.git
提升报错需要管理员权限:
关闭bash,让后用管理员权限打开git bash,进入工程目录再次执行命令:
repo init -u https://gitee.com/monkeyqiyu/manifest.git
然后执行同步,即可拉取要管理的git 仓库:
repo sync
项目清单库介绍
repo脚本库(.repo/repo)
repo对git命令进行了封装,提供了一套repo的命令集(包括init, sync等),所有repo管理的自动化实现也都包含在这个git库中。 在第一次初始化的时候,repo会从远程把这个git库下载到本地。
仓库目录和工作目录
仓库目录保存的是历史信息和修改记录,工作目录保存的是当前版本的信息。一般来说,一个项目的Git仓库目录(默认为.git目录)是位于工作目录下面的,但是Git支持将一个项目的Git仓库目录和工作目录分开来存放。 对于repo管理而言,既有分开存放,也有位于工作目录存放的:
- manifests: 仓库目录有两份拷贝,一份位于工作目录(.repo/manifests)的.git目录下,另一份独立存放于.repo/manifests.git
- repo:仓库目录位于工作目录(.repo/repo)的.git目录下,repo的源码,这个仓库我们不用管。
- project:所有被管理git库的仓库目录都是分开存放的,位于.repo/projects目录下。同时,也会保留工作目录的.git,但里面所有的文件都是到.repo的链接。这样,即做到了分开存放,也兼容了在工作目录下的所有git命令。
既然.repo目录下保存了项目的所有信息,所有要拷贝一个项目时,只是需要拷贝这个目录就可以了。repo支持从本地已有的.repo中恢复原有的项目。
.repo
├── manifests # 一个git库,包含default.xml文件,用于描述repo所管理的git库的信息
├── manifests.git # manifest这个git库的实体,manifest/.git目录下的所有文件都会链接到该目录
├── manifest.xml # manifests/default.xml的一个软链接
└── repo # 一个git库,包含repo运行的所有脚本
repo常见命令使用
repo命令的使用格式如下所示:
$ repo <COMMAND> <OPTIONS>
可选的的有:help、init、sync、upload、diff、download、forall、prune、start、status,每一个命令都有实际的使用场景;
项目开发流程是:
- repo init初始化工程,指定待下载的分支
- repo sync下载代码
- repo start将本地git库切换到开发分支(TOPIC BRANCH)
- 在本地进行修改,验证后,提交到本地
- repo upload上传到服务器,等待review
Repo + Gitee 本地开发流程
repo start {branch} --all # 切换开发分支,当对部分仓库进行指定时,会触发仓库的预先fork repo forall -c git add ./ git add / repo stage # 批量加入暂存区或者单独加入 repo forall -c git commit / git commit # 批量进行提交或者单独提交 repo config --global repo.token {TOKEN} # 进行 gitee access_token 配置, access_token 获取连接 https://gitee.com/profile/personal_access_tokens repo config repo.pullrequest {True/False} # 对是否触发PR进行配置 repo push --br={BRANCH} --d={DEST_BRANCH} # 进行推送并生成PR和审查,执行后会展示出可进行推送的项目,去掉注释的分支会进行后续推送 repo gitee-pr --br={BRANCH} # 获取项目推送后的指定分支的PR列表
实用命令介绍
repo init -u ssh://xxx/manifest
ssh://xxx/manifest 是一个git仓库,这个仓库有1个xml文件,这个文件记录了要管理的git仓库路径
repo sync #clone所有git仓库
repo start master --all //所有git仓库创建master分支
repo forall –c git xxx #对所有git仓库执行git命令
repo sync #(除非明确让你用,否则不要用) 更新所有仓库的代码
repo forall –c git pull --rebase
#提交所有仓库的commit到远程服务器
repo upload (不稳定,有时处理不了中文)
repo forall –c git push origin HEAD:refs/for/master