从零开始搭建repo 与使用
一、repo 简介
在一个大型项目中,一般会拆成多个子系统来分开管理,每一个子系统都对应着一个git
仓库。但在拉取整个项目的时候就需要一个一个去拉取仓库,或者要写一个shell
脚本去拉取,这样做可以,但略显笨拙。于是repo
来拯救了我们,r它是一个建立在git
上的工具,本质其实是一个Python
脚本,所以需要安装Python
,像Android
这样的系统也是用repo
来管理的。
二、repo服务端的搭建
首先,在服务端只需要建立一个仓库名为manifest
,我这里使用的是gitee
(使用自己搭建的git
服务器也是一样的)
然后可以git clone
到本地来操作。
在manifest
中,创建一个.xml
文件,该文件就决定了需要下载哪些仓库,如我创建了一个game.xml
文件
然后在其中输入:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="gitee"
fetch="https://gitee.com/chensmart" />
<default revision="master"
remote="gitee" sync-j="2" />
<project path="data" name="game" revision="master" />
</manifest>
- remote: 远程服务端,
name
为repo
仓库名称,fetch
为 仓库url
- default:设置每个项目默认的仓库和分支,
remote
指定了使用哪一个远程服务端 - project: 每个项目的git仓库,
path
会指向下载后的仓库放在那个路径 - name: 服务端git仓库名称,指向的是在
fetch
在已有的仓库名。 - revision: 分支名称或者
commit id
完成之后就提交上去。
到此,服务端的任务就完成了,其实在服务端就是建了一个仓库而已,然后在其中创建了一个xml
文件,并在其中指定了需要的仓库。
三、repo客户端的搭建
首先在客户端我们就需要安装repo
的应用:
sudo snap install git-repo
使用自带源下载的repo
会出问题,所以我们使用以下的方法
mkdir ~/bin
PATH=~/bin:$PATH
git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
cd git-repo/
cp repo ~/bin/
chmod a+x ~/bin/repo
这样在后续的使用中就不会出问题(血泪的教训啊)
然后,创建一个文件夹下载我们仓库,在其中使用repo
初始化命令:
repo init -u https://gitee.com/chensmart/manifest -b master -m game.xml
- -u(–manifest-url):设定清单库的
Git
服务器地址 - -m(–manifest-name):当有多个清单文件时,指定清单库中的某个清单为有效的清单文件。默认为
default.xml
- -b(–manifest-branch):选择一个
maniest
仓库中的一个特殊的分支
然后输入用户名和密码
现在文件夹下就有了.repo
文件夹,repo init
主要完成了如下操作:
- 完成
repo
工具的完整下载,现有的不过是repo
的引导程序。初始化操作会从repo
脚本里设定的镜像地址中克隆repo.git
库到当前的目录下的.repo
文件夹中。 - 克隆创建的清单库
manifest.git
,也就是我们在服务端创建的仓库,里面game.xml
文件是repo
工作的指引文件。
最后同步就是同步项目了,把manifest.git
中的清单文件game.xml
中所指引的仓库下载下来。
repo sync
经过同步,指定仓库中的内容就可以下载下来了。
如果某个仓库同步过,repo sync
就相当于git clone
操作,把对应的远程仓库拷贝到本地来。
如果工程已经同步过,repo sync
就相当于git remote update
git rebase origin/branch
四、总结
其实repo
的搭建并不复杂,服务端只需要建立一个仓库即可,而客户端就安装repo
工具,对服务器和原项目不需要有多大的改动。
原理也很简单,其实就像一个shell
脚本,通过.xml
文件里的指引,把remote
的fetch
与project
的name
组合起来就是一个仓库的链接,然后通过该链接去下载对应的仓库而已。当然,repo
还有其他的功能如使用linkfile
可以在同步完成后创建链接,还有其他功能,这些就有待读者去发掘了。
ject的
name组合起来就是一个仓库的链接,然后通过该链接去下载对应的仓库而已。当然,
repo还有其他的功能如使用
linkfile`可以在同步完成后创建链接,还有其他功能,这些就有待读者去发掘了。