本教程介绍如何将远程代码仓库镜像到本地,并将其成功推送到Gerrit代码审查服务器的过程和步骤。适合需要管理私有Git仓库的团队参考。
### 从远端下载repo镜像并推送到本地Gerrit服务器
#### 知识点一:Repo工具概述
Repo是Google为Android项目提供的一个分布式版本控制系统,它基于Git之上构建,主要用于管理大型项目的多仓库结构。通过Repo工具,开发者可以方便地管理多个Git仓库,并实现统一的构建流程。
#### 知识点二:下载Repo镜像
1. **下载Repo镜像命令**:
```bash
$ repoinit -u ssh:git@远端URL --mirror
```
这条命令用于从指定的远端URL(例如 `ssh:git@gitlab.samba.org.cnmanifests-b`)下载repo镜像。其中,`--mirror`参数表示将远端仓库下载为镜像形式。镜像模式意味着只下载提交历史,但不会创建工作树,适用于需要快速同步或备份场景。
#### 知识点三:查询与创建本地Gerrit服务器仓库
1. **查询本地Gerrit服务器上的仓库**:
```bash
$ ssh -p29418 -i ~/.ssh/id_rsa -l 192.168.3.6 gerrit ls-projects
```
此命令用于查询本地Gerrit服务器上的所有仓库。`-p29418`指定了SSH端口;`-i ~/.ssh/id_rsa`指定了私钥路径;`-l `指定了登录用户名。
2. **创建单个仓库**:
```bash
$ ssh -p29418 @192.168.3.6 gerrit create-project projectA
```
使用此命令可以创建名为 `projectA` 的仓库。
3. **批量创建仓库**:
```bash
$ repo forall -c ssh -p29418 @192.168.3.6 gerrit create-project projectA$REPO_PROJECT
```
此命令利用 `repo forall` 命令遍历所有项目,并使用 `gerrit create-project` 创建相应仓库。这里 `$REPO_PROJECT` 代表远端仓库名。
#### 知识点四:设置仓库权限
1. **设置仓库权限**:
```bash
$ repo forall -c ssh -p29418 @192.168.3.6 gerrit set-project-parent --parent=projectA projectA$REPO_PROJECT
```
使用此命令可以为每个项目设置继承自 `projectA` 的权限。这对于统一管理多个仓库的权限非常有用。
#### 知识点五:推送本地分支到Gerrit服务器
1. **推送本地分支到Gerrit服务器**:
```bash
$ repo forall -c git push ssh:@192.168.3.6:29418projectA$REPO_PROJECT +refsheads*
```
此命令使用 `repo forall` 遍历所有项目,并将每个项目中的所有分支推送到Gerrit服务器上的对应仓库。`+refsheads*` 表示推送所有本地分支。
2. **推送所有tags到Gerrit服务器**:
```bash
$ repo forall -c git push ssh:@192.168.3.6:29418projectA$REPO_PROJECT +refstags*
```
类似于推送分支,该命令将所有本地 tags 推送到 Gerrit 服务器上的对应仓库。
#### 知识点六:处理推送问题
在某些情况下,推送可能会遇到权限问题。这时需要确保Gerrit服务器上有相应的权限配置。例如,在Gerrit上为特定用户或组配置权限,允许他们上传tags等。
如果直接推送失败,也可以考虑先将下载的镜像拷贝到服务器的相关目录下,然后再进行权限配置。这种方法虽然不够自动化,但在某些特殊情况下可能是唯一可行的方式。
#### 知识点七:Manifest文件的推送
1. **创建并初始化manifests仓库**:
```bash
$ ssh -p29418 @192.168.3.6 gerrit create-project -p projectAprojectAmanifests --empty-commit
```
这条命令用于在Gerrit服务器上创建名为 `projectAmanifests` 的仓库,并添加一个空提交记录。
2. **推送manifest文件到Gerrit服务器**:
```bash
$ git init
$ git add .
$ git commit -m add manifests file!
$ git checkout -b ku
$ git remote add gerrit ssh:@192.168.3.6:29418projectAmanifests
$ git