极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3812|回复: 0

创建repo管理git仓库

[复制链接]
发表于 2016-3-23 16:45:10 | 显示全部楼层 |阅读模式
一 建立本地的git仓库。将文件 push到本地。

  1 准备工作。
    安装git工具。 yum安装git-core就行了。
    局域网中的两台主机,当然在本机上建也行。
      本机:192.168.160.89.
      git服务器:192.168.160.83

    git服务器下新建git用户,必要时允许匿名访问。

  2 例如要将本机上的某个目录(如moon)作成一个git repo,传到git服务器上。
    moon 下结构
    .
    |-- file1
    `-- file2
    开始了,首先在git服务器上操作。
    # mkdir /pub/git/moon.git
    # cd /pub/git/moon.git
    # git init --bare
    # chown git:git /pub/git/moon.git -R
     
     在本机上操作
    # cd moon
    # git init-db
    # git add *
    # git commit -m -a "first"
    # git remote add master git@192.168.160.83:/pub/git/moon.git
    # git push master --all
    之后如果顺利的话就可以将moon目录上传到git服务器上了,

    在别的目录后主机上git clone就可以得到moon目录。
    git clone git@192.168.160.83:/pub/git/moon.git


二 将android源码在git服务器上保存。
     1 android 源码git介绍。
      android用repo管理,repo其实就是为了更好的管理多个git子项目,也就是说android源码中有多个子git项目,每个含有.git目录的目录就是一个git子项目。

     2 先对某一个git子项目进行操作。
       bionic就是android源码中的一个子git项目。
       # cd bionic
       # rm .git -rf
       # git add *
       # git commit -m -a "first"
       # git remote add master git@192.168.160.83:/pub/git/android/bionic.git
       # git push master --all

        就行了,当然git服务器上得有bionic.git目录。

     3 用repo在git服务器上管理android源码。

    自己新建一个repo管理git仓库:
    假设目前已经配置好了git,gitweb等,且目前有用户: git 和 yyl,且yyl用户可以匿名访问git用户(ssh-key-copy...):
    本机获得ssh pub key:
    $ ssh-keygen       //不需要输入什么,直接按Enter键就可以了
    在服务器上设置可以允许我的本机匿名登录
    ssh-copy-id -i ../moon.pub git@192.168.160.83   // moon.pub就是我的pub key
    这样再次ssh git@192.168.160.83 的时候就不用密码了

    下边是建立自己的repo git仓库

    本机端:
    $ mkdir test_one
    $ cd test_one
    $ tree
    |-- aa
    |   |-- a1
    |   `-- a2
    |-- bb
    |   |-- b1
    |   `-- b2
    `-- cc
        |-- dd
        |   |-- d1
        |   `-- d2
        |-- manifest
        |   |
        |   `-- default.xml
        `-- ee
            |-- e1
            `-- e2
    这是yyl用户下的一个普通项目目录,我想为他创建远程git仓库,并且分多个git来逐个管理,这时就需要用repo来管理这些git:
    $ cd aa
    $ git init-db
    $ git add *
    $ git commit -a -m "first init"
    $ cd bb
    $ git init-db
    $ git add *
    $ git commit -a -m "first init"
    $ cd cc/dd
    $ git init-db
    $ git add *
    $ git commit -a -m "first init"
    $ cd ../ee
    $ git init-db
    $ git add *
    $ git commit -a -m "first init"
    $ cd ../manifest/
    $ git init-db
    $ git add *
    $ git commit -a -m "first init"
    }}}

    服务器端:
    我们将在git用户下创建git仓库:[[BR]]

    $ cd /pub/gittrees/
    $ mkdir test_one;cd test_one
    $ mkdir aa.git
    $ git init --bare
    因为bb、dd、ee目录的特殊性,我想将他们放在一个独立的目录中:
    $ mkdir platform;cd platform
    $ mkdir bb.git; cd bb.git
    $ git init --bare
    $ cd -
    $ mkdir cc; cd cc
    $ mkdir dd.git; cd dd.git
    $ git init --bare
    $ cd -
    $ mkdir ee.git; cd ee.git
    $ git init --bare
    $ cd -
    $ mkdir manifest.git; cd manifest.git
    $ git init --bare

    本机端:


    {{{
    $ cd test_one
    $ cd aa
    $ git remote add master /pub/gittrees/test_one/aa.git
    $ git push master --all
    ......

    完成后,拷贝manifest项目:
    $ git clone git@192.168.160.83:/pub/gittrees/test_one/platform/manifest.git
    $ cd manifest
    $ vim default.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <manifest>
      <remote  name="origin"
               fetch="../.." />

      <default revision="master" remote="origin" />

      <project path="aa" name="aa" />
      <project path="bb" name="plathform/bb" />
      <project path="cc/dd" name="plathform/cc/dd" />
      <project path="cc/ee" name="plathform/cc/ee" />
    </manifest>
    注意: fetch="../.." /> 中 会考虑default.xml所在的路径。如default.xml路径为:/pub/gittree/test_one/platform/manifest . 而fetch为"../.." 。则
    最后的url为:/pub/gittree/test_one .

    $ git commit -a -m "modigy default.xml"
    $ git push
    这时,就可以下载所有的test_one项目了:
    $ mkdir test; cd test
    $ repo init -u git@192.168.160.83:/pub/gittrees/test_one/platform/manifest.git -b master
    $ repo sync

    这样就可以下载在整个目录了,含有多个git仓库。


附:
Android Repo的manifest XML文件格式




Android使用repo来管理多个git项目。它需要一个manifest  XML文件来指示这些git项目的属性。

repo manifest XML可以包含下面的元素。

    manifest: 最顶层的XML元素。
    remote元素: 设置远程git服务器的属性,包括下面的属性
        name: 远程git服务器的名字,直接用于git fetch, git remote 等操作
        alias: 远程git服务器的别名,如果指定了,则会覆盖name的设定。在一个manifest中,
        name不能重名,但alias可以重名。
        fetch: 所有projects的git URL 前缀
        review: 指定Gerrit的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果。

Example:

<remote fetch="ssh://git.example.com" name="test"review="gerrit.example.com"/>



    default元素:设定所有projects的默认属性值,如果在project元素里没有指定一个属性,则使用default元素的属性值。
        remote: 之前定义的某一个remote元素中name属性值,用于指定使用哪一个远程git服务器。
        revision: git分支的名字,例如master或者refs/heads/master
        sync_j: 在repo sync中默认并行的数目。
        sync_c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
        sync_s: 如果设置为true,则会同步git的子项目

Example:

<default remote="main" revision="platform/main"/>



    manifest-server元素: 只能有一个该元素。它的url属性用于指定manifest服务的URL,通常是一个XML RPC 服务。
    它要支持一下RPC方法:
        GetApprovedManifest(branch, target): 返回一个manifest用于指示所有projects的分支和编译目标。
            target参数来自环境变量TARGET_PRODUCT和TARGET_BUILD_VARIANT,组成$TARGET_PRODUCT-$TARGET_BUILD_VARIANT。
        GetManifest(tag):  返回指定tag的manifest



    project元素:指定一个需要clone的git仓库。
        name: 唯一的名字标识project,同时也用于生成git仓库的URL。格式如下:
              ${remote_fetch}/${project_name}.git
        path: 可选的路径。指定git clone出来的代码存放在本地的子目录。如果没有指定,则以name作为子目录名。
        remote: 指定之前在某个remote元素中的name。
        revision: 指定需要获取的git提交点,可以是master, refs/heads/master, tag或者SHA-1值。
        groups: 列出project所属的组,以空格或者逗号分隔多个组名。所有的project都自动属于"all"组。每一个project自动属于
        name:'name' 和path:'path'组。例如<project name="monkeys" path="barrel-of"/>,它自动属于default, name:monkeys, and path:barrel-of组。如果一个project属于notdefault组,则,repo sync时不会下载。
        sync_c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
        sync_s: 如果设置为true,则会同步git的子项目。
        upstream: 在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间。
        annotation: 可以有多个annotation,格式为name-value pair。在repo forall 命令中这些值会导入到环境变量中。
        remove-project: 从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义。

Example:

             <project groups="aosp" path="device/driver/armv7" revision="600aab270ce712b62b268055737cabcded59bf04"/>



    include: 通过name属性可以引入另外一个manifest文件(路径相对与manifest repository's root)。



本地manifest

本地的manifest文件存放在$(TOP_DIR)/.repo/local_manifest/*.xml。$TOP_DIR/.repo/local_manifests/local_manifest.xml
如果存在,会被最先装入。然后是以字母顺序的$TOP_DIR/.repo/local_manifests/*.xml文件。这些manifest会在repo sync
之前被处理。以便repo下载和管理额外的project。



Example:

  $ ls .repo/local_manifests

  local_manifest.xml

  another_local_manifest.xml



  $ cat.repo/local_manifests/local_manifest.xml

  <?xml version="1.0"encoding="UTF-8"?>

  <manifest>

    <project path="manifest"

             name="tools/manifest"/>

    <projectpath="platform-manifest"

             name="platform/manifest"/>

  </manifest>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-2-24 00:00 , Processed in 0.083988 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表