创建自己的Repo Server

作者:ITleaks 和服务器相关  

     很久以前出于好奇仔细了解了下Repo及服务器的原理,但是今天突然发现有些忘了,于是想记录下来。


Repo机制


    Repo是google官方为管理Android项目开发出来的一个软件。我们先来看下官方对该软件的描述。

Repo is a tool thatwe built on top of Git. Repo helps us manage the many Git repositories, doesthe uploads to our revision control system, and automates parts of the Androiddevelopment workflow. Repo is not meant to replace Git, only to make it easierto work with Git in the context of Android. The repo command is an executablePython script that you can put anywhere in your path


    从上面可以看出,repo本身并不负责项目的管理(记录项目的更新,回退更新等),它只是一个基于git之上的工具,用来管理多个git项目的便捷工具。它是用python实现。

      我们知道Android里面的各个模块是用git来管理的,Android里有大量的这种模块,多达200多个,如果用户一个一个的使用git pull/fetch去更新每个git项目,那任务量太大了,同时用户还必须知道每个git对应的branch信息。Repo工具就为解决这个问题的,它借助一个manifest.git项目列出了所有被管理的git的信息,包括目录结构,branch,获取地址等等。


Repo干了什么事


        我们执行repo时一般是使用如下命令:

       repo init –u /media/itleaks/git/repositories/platform/manifest.git

       -u 后面的参数是重点,当用户执行这条命令后,repo工具相当于执行了

mkdir .repo
cd .repo
git clone /media/itleaks/git/repositories/platform/manifest.git


       我们来看下一个android repo项目的manifest.git的内容:

itleaks@Itleaks:/media/itleaks/source/4.4$ cat .repo/manifests/.git/config |more
[core]
	repositoryformatversion = 0
	filemode = true
[remote "origin"]
	url = /media/itleaks/git/repositories/platform/manifest.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[repo]
	reference = /media/itleaks/git/mirror/android.googlesource.com/
[branch "default"]
	remote = origin
	merge = master

itleaks@Itleaks:/media/itleaks/source/4.4$ cat .repo/manifests/default.xml |more
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  //可以定义多个remote
  <remote  name="aosp"
           review="review.source.android.com"
           //这个就是获取git的服务器地址,这里是一个相对目录..
           //刚刚我们提到过,manifests本身也是一个git项目,它自然就有地址
           //这个..指出下面的所有git项目的根目录在manifests项目目录的上层目录,即
           //  /media/itleaks/git/repositories/
           fetch=".." />
  //默认的remote就是上面的aosp
  <default revision="refs/tags/android-4.4_r1"
           remote="aosp"
           sync-j="4" />
  //项目路径,项目名称
  //这个描述执行后,相当于用户执行如下两条命令
  // cd ROOTDIR/art
  // git clone /media/itleaks/git/repositories/platform/platform/art
  <project path="art" name="platform/art" />
  <project path="bionic" name="platform/bionic" groups="pdk" />
  <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy" />
  <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
  <project path="bootable/recovery" name="platform/bootable/recovery" groups="pdk" />
  <project path="cts" name="platform/cts" groups="cts" />
  <project path="dalvik" name="platform/dalvik" />

        然后用户执行repo sync后才开始真正按照上面描述的规则下载所有代码项目。即循环执行git clone /media/itleaks/git/repositories/platform/xx


建立repo server


 从零开始建立reposerver

        从上可以看出,建立repo server的核心是建立manifest.git项目。

//创建目录
mkdir /tmp/git/repositories/platform -p
cd /tmp/git/repositories/platform
//建立测试git test
mkdir test;git init;touch 1.txt;git add .;git commit –asm “initial version”
//建立测试git test1
mkdir test1;git init;touch 2.txt;git add .;git commit –asm “initial version”
//建立manifest git
mkdir manifest;git init;touch default.xml;git add .;git commit –asm “initial version”
然后修改default.xml,输入如下信息
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="test "
           fetch="."
           review="https://android-review.googlesource.com/" />
  <default revision="master"
           remote="test"
           sync-j="4" />

  <project path="test" name="test"/>
  <project path="test1" name="test1" /> 
</manifest>
这样就建好,提交
git commit –asm “add real content”

        执行完上面的操作后,我们就可以使用这个repo server了

        本地用户只需执行:repo –u /tmp/git/repositories/platform/manifest就可下载这个reposerver的项目代码。

         远程机器通过:repo –u ssh:ip:/tmp/git/repositories/platform/manifest


优化repo server数据内容


         上面的方法有一个很不好的就是这个server下的每个git项目是有冗余信息的。因为reposerver里是不需要直接操作git项目里的内容的,往往是repo client修改代码后提交上去来修改server的数据。因此git提供了一个—bare参数来优化git server的数据,即git server端所有内容以二进制管理。所以上面的repo server的生成应该是这样。以test git 为例:

下面的命令

    cd /tmp/git/repositories/platform;mkdir test;gitinit;touch 1.txt;git add .;
    git commit –asm “initial version”

需改为:

//建立client git
     cd /tmp;mkdir test;git init;touch 1.txt;git add .;gitcommit –asm “initial version”
//建立server git
     cd/tmp/git/repositories/platform;git clone /tmp/test –bare;


       这样在server目录/tmp/git/repositories/platform下的所有git的数据都是优化过的。


利用已有repo建立自己的repo server


       这个方式是很有用的,比如一家公司进行android项目开发,首先肯定是需要下载aosp的base code,然后在上面进行一些修改,公司在内部建立一个repo sever,其他所有的员工直接从公司的这个repo server下载代码,而不是从google官方下载。这首先是提高了下载速度,本地局域网下载肯定比远程下载快。

        事实上,任何一个已有的repo经过简单修改都可以变为一个reposerver.比如如果一用户通过执行下面的命令完成了android的下载。

  

cd  /media/ Itleaks /source/4.4
repo init –u /media/itleaks/git/repositories/platform/manifest.git
repo sync

       然后他只需在根目录下建立一个manifest项目,并且拷贝文件.repo/manifest/default.xml并修改即可将这个repo项目变为reposerver。


利用repo mirror建立自己的repo server


      其实repo提供一个更加好的参数用来建立repo server,即repo –mirror. 比如你想要建立一个android的repo server,只需执行如下命令即可:

repo init –u /media/itleaks/git/repositories/platform/manifest.git –mirror
repo sync


相关资料:

创建自己的Repo Server来源网络,如有侵权请告知,即处理!

编程Tags: