Manage Project with Google Repo -- Example

用Google Repo管理多仓库项目之范例

Posted by Wingin Cheung on June 13, 2019

用Google Repo管理多仓库项目之范例

1、远程git服务器

我们假设有一个远程git服务器,用于存储git仓库:

  • 服务器名:gitserver

  • IP地址:192.168.1.200

  • 账户:git

  • 现有仓库列表:

      git@gitserver:~/repository$ pwd
      /home/git/repository
      git@gitserver:~/repository$ tree -d
      .
      |-- apps
      |   |-- chromium.git
      |   |-- tcpdump.git
      |   |-- ping.git
      |-- hardware
          |-- broadcom
          |   |-- gps.git
          |   |-- nfc.git
          |   |-- wlan.git
          |-- akm.git
          |-- marvell.git
    
  • 现有仓库tag信息:

      git@gitserver:~/repository$ find $(pwd) -name "*.git" | xargs -I {} \
      > sh -c "cd {}; echo {}\":\"; git tag"
      /home/git/repository/apps/chromium.git:
      v1.0
      v2.0
      /home/git/repository/apps/tcpdump.git:
      v0.1
      v0.2
      v1.0
      v1.1
      /home/git/repository/apps/ping.git:
      v1.0
      /home/git/repository/hardware/broadcom/gps.git:
      v1.0
      /home/git/repository/hardware/broadcom/nfc.git:
      v1.0
      v1.1
      /home/git/repository/hardware/broadcom/wlan.git:
      v1.0
      v1.1
      /home/git/repository/hardware/akm.git:
      v1.0
      /home/git/repository/hardware/marvell.git:
      v1.0
    
  • 现有仓库branch信息:

      git@gitserver:~/repository$ find $(pwd) -name "*.git" | xargs -I {} \
      > sh -c "cd {}; echo {}\":\"; git branch"
      /home/git/repository/apps/chromium.git:
      * master
      /home/git/repository/apps/tcpdump.git:
      * master
        plat-v1.0
      /home/git/repository/apps/ping.git:
      * master
      /home/git/repository/hardware/broadcom/gps.git:
      * master
      /home/git/repository/hardware/broadcom/nfc.git:
      * master
      /home/git/repository/hardware/broadcom/wlan.git:
      * master
      /home/git/repository/hardware/akm.git:
      * master
      /home/git/repository/hardware/marvell.git:
      * master
    

2、客户端

我们假定集成所有git仓库管理的客户端信息如下:

  • 客户端名称:workPC

  • IP地址:192.168.1.101

  • 用户名称:workusr

  • 期望的仓库信息:

      workusr@workPC:~/tag_repo$ pwd
      /home/workusr/tag_repo
      workusr@workPC:~/tag_repo$ tree
      .
      |-- external
      |   |-- apps
      |   |   |-- chromium
      |   |       |-- chromium.c
      |   |       |-- ...
      |   |-- tcpdump
      |   |   |-- tcpdump.c
      |   |   |-- ...
      |   |-- ping
      |       |-- ping.c
      |       |-- ...
      |-- drivers
      |   |-- gps
      |   |   |-- gps.c
      |   |   |-- ...
      |   |-- wlan
      |       |-- wlan.c
      |       |-- ...
      |-- others
          |-- akm
          |   |-- akm.c
          |   |-- ...
          |-- marvell
          |   |-- marvell.c
          |   |-- ...
          |-- nfc
              |-- nfc.c
              |-- ...
    
  • 期望的仓库版本信息:

      /home/workusr/tag_repo/external/apps/chromium:
      tag -- v2.0
      /home/workusr/tag_repo/external/tcpdump:
      branch -- plat-v1.0
      /home/workusr/tag_repo/external/ping:
      branch -- master
      /home/workusr/tag_repo/drivers/gps:
      tag -- v1.0
      /home/workusr/tag_repo/drivers/wlan:
      branch -- master
      /home/workusr/tag_repo/others/akm:
      branch -- master
      /home/workusr/tag_repo/others/marvell:
      branch -- master
      /home/workusr/tag_repo/others/nfc:
      branch -- master
    

3、创建manifest

为了达到使用repo管理,我们需要准备manifest仓库。

我们先在远处git客户端建立一个manifests.git仓库,用于存储manifest相关文件:

workusr@workPC:~/tag_repo$ ssh 192.168.1.200 -l git
git@192.168.1.200\'s password:
git@gitserver:~$ cd ~/repository
git@gitserver:~/repository$ git init --bare manifests.git
Initialized empty Git repository in /home/git/repository/manifests.git/
git@gitserver:~/repository$ exit

我们在客户端中clone远程git服务器中的manifests.git仓库:

workusr@workPC:~$ git clone git@192.168.1.200:/home/git/repository/manifests.git
Cloning into 'manifests'...
warning: You appear to have cloned an empty repository.

好了,我们现在开始编辑default.xml文件:

workusr@workPC:~$ cd manifests
workusr@workPC:~/manifests$ vi default.xml

在打开的vi文件编辑界面中,输入以下内容并保存:

<?xml version='v1.0' encoding='UTF-8'?>

<manifest>
    <!-- server configuration -->
    <remote  name="git-server"
             fetch="ssh://git@192.168.1.200:/home/git/repository" />
    <default revision="master"
             remote="git-server"
             sync-j="4" />
    
    <!-- project configuration -->
    <project name="apps/chrominum" path="external/apps/chromium" revision="refs/tags/v2.0" />
    <project name="apps/tcpdump" path="external/tcpdump" revision="plat-v1.0" />
    <project name="apps/ping" path="external/ping" />
    <project name="hardware/broadcom/gps" path="drivers/gps" revision="refs/tags/v1.0" />
    <project name="hardware/broadcom/wlan" path="drivers/wlan" />
    <project name="hardware/akm" path="others/akm" />
    <project name="hardware/marvell" path="others/marvell" />
    <project name="hardware/broadcom/nfc" path="others/nfc" />
</manifest>

好了,default.xml文件我们已经准备好了,我们将其加入版本管理并上传到远程git服务器中:

workusr@workPC:~/manifests$ git add default.xml
workusr@workPC:~/manifests$ git commit -m "add defaul.xml"
[master (root-commit) d9e01db] add default.xml
 1 file changed, 20 insertions(+)
 create mode 100644 default.xml
workusr@workPC:~/manifests$ git push origin master
Counting objects: 3, done
Delta compression using up to 16 threads.
Compressing objects: 100% (2/2), done
Writing objects: 100% (3/3), 553 bytes | 553.00 KiB/s, done
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.1.200:/home/git/repository/manifests.git
 * [new branch]         master -> master

4、初始化tag_repo

OK,一切准备就绪,我们开始初始化tag_repo目录:

workusr@workPC:~/manifests$ mkdir -p ~/tag_repo
workusr@workPC:~/manifests$ cd ~/tag_repo
workusr@workPC:~/tag_repo$ repo init -u git@192.168.1.200:/home/git/repository/manifest.git
...
workusr@workPC:~/tag_repo$ repo sync
...

5、创建分支

repo sync完成后,所有的仓库均处于no branch状态,不能进行仓库操作

workusr@workPC:~/tag_repo$ repo branch
    (no branches)

我们需要对指定项目初始化分支,例如对所有项目:

workusr@workPC:~/tag_repo$ repo start newbranch --all

也可以只对ping子项目:

workusr@workPC:~/tag_repo$ repo start pingbranch external/ping

初始化分支后,我们可以使用repo branch查看:

workusr@workPC:~/tag_repo$ repo branch
...
*  newbranch                | in all projects
*  pingbranch               | in external/ping

6、项目文件修改及其提交

初始化分支后,我们接下来的操作与git相同。

现在我们来修改文件并提交相关修改,以下以子项目ping中的ping.c修改为例。

我们先查看一下创建分支后我们所有项目的状态:

workusr@workPC:~/tag_repo$ repo status
...
project external/apps/chromium/            branch newbranch
project external/tcpdump/                  branch newbranch
project external/ping/                     branch pingbranch
project drivers/gps/                       branch newbranch
project drivers/wlan/                      branch newbranch
project others/akm/                        branch newbranch
project others/marvell/                    branch newbranch
project others/nfc/                        branch newbranch

下面我们进行文件修改操作,例如在ping.c最后添加一句“hello world“,然后再查看一下项目状态:

workusr@workPC:~/tag_repo$ cd external/ping
workusr@workPC:~/tag_repo/external/ping$ echo "hello world." >> ping.c
workusr@workPC:~/tag_repo/external/ping$ repo status
...
project external/apps/chromium/            branch newbranch
project external/tcpdump/                  branch newbranch
project external/ping/                     branch pingbranch
 -m     ping.c
project drivers/gps/                       branch newbranch
project drivers/wlan/                      branch newbranch
project others/akm/                        branch newbranch
project others/marvell/                    branch newbranch
project others/nfc/                        branch newbranch

可以看到ping.c被标记为”-m”,即被修改状态。

我们使用git命令将其修改提交:

workusr@workPC:~/tag_repo/external/ping$ git add ping.c
workusr@workPC:~/tag_repo/external/ping$ repo status
...
project external/apps/chromium/            branch newbranch
project external/tcpdump/                  branch newbranch
project external/ping/                     branch pingbranch
 M-     ping.c
project drivers/gps/                       branch newbranch
project drivers/wlan/                      branch newbranch
project others/akm/                        branch newbranch
project others/marvell/                    branch newbranch
project others/nfc/                        branch newbranch
workusr@workPC:~/tag_repo/external/ping$ git commit -m "modify test"
...
workusr@workPC:~/tag_repo/external/ping$ repo status
...
project external/apps/chromium/            branch newbranch
project external/tcpdump/                  branch newbranch
project external/ping/                     branch pingbranch
project drivers/gps/                       branch newbranch
project drivers/wlan/                      branch newbranch
project others/akm/                        branch newbranch
project others/marvell/                    branch newbranch
project others/nfc/                        branch newbranch

到此,我们已经将其修改提交到本地的版本库了。

我们还可以继续将本次修改提交到远程仓库:

workusr@workPC:~/tag_repo/external/ping$ git push --all

我们可以在远程仓库执行git branch,确实是否有新提交的名为pingbranch的分支;可以执行git show pingbranch查看详细的提交信息。

我们可以直接在子项目下使用git相关指令来控制项目版本,也可以在git命令前添加repo forall -c来控制项目版本,不过,后者将在所有工程中执行相关操作