My Octopress Blog

Rise of the Apes.

Git仓库的建立以及repo的管理

1. repo 的安装

一般服务器上都安装了git,所以只需安装repo即可
简单一点的方法,就是直接从253服务器拷贝

1.1 拷贝repo脚本

路径:/usr/bin/repo
拷贝到当前服务器的相同目录下,即/usr/bin

1.2然后拷贝repo程序目录到当前服务器

路径:elink-soft@192.168.2.253:/home/elink-soft/repo
拷贝到本地服务器任意目录
比如拷贝到/work/repo/下面

1.3然后用vim编辑repo脚本

1
vim /usr/bin/repo

修改

1
REPO_URL='elink-soft@192.168.2.253:~/repo/repo.git'

这句为之前repo程序目录的拷贝到的地址,如本处应改为

1
REPO_URL='/work/repo'

2. git仓库的建立

2.1 服务器端:

此端建立git仓库,用于代码的下载,提交和管理
以192.168.2.96作为管理代码的服务器,elink账户作为代码管理账户
以89代码为例:

2.1.1

在elink的主目录下建立mq89目录,作为仓库的存放路径(m:mtk;q:quad;89:89 series)

2.1.2

在mq89下面分别建立2个目录:alps、manifest.git

1
2
3
mkdir alps manifest.git
ls
alps manifest.git

2.1.3

在manifest.git目录中创建空的git仓库

1
git init --bare

2.1.4

很关键的一步,在alps下面创建**.git文件夹
规则:事先规划应该在哪些目录下面建立git仓库,以方便代码的管理。如,alps/kernel下面需要一个仓库,那么
就在alps目录下建立kernel.git目录,用于存放原始代码的远程仓库,然后初始化git,同2.3

1
2
3
cd alps
mkdir kernel.git
git init --bare

如果是abi/cpp/下面有个git仓库
则应该递归创建目录abi/cpp.git

1
2
cd alps
mkdir -p abi/cpp.git

至此,服务器端的准备工作完毕

2.2 本机端:

此端作为原始代码的存放地,负责更新mtk的最新补丁,然后上传到服务器端
假设代码存放在mq89_std/alps目录下

2.2.1

创建本地的git仓库,和2.1.4的路径是相互关联
比如在服务器端有alps/kernel.git仓库
则在本地需有alps/kernel/.git仓库,即初始化git仓库是在kernel目录下

1
2
3
4
5
6
7
8
cd alps/kernel
git init-db
git add .
// 双引号内为修改提交提示,比如可以将prompt改成ph init git repository
git commit -am "prompt"
// 此句非常关键,把远程仓库和本地仓库联系起来
git remote add master elink@192.168.2.98:~/mq89/alps/kernel.git
git push master --all

如果是远程仓库abi/cpp.git

1
2
3
4
5
    cd alps/abi/cpp
    git add .
    git commit -am "prompt"
    git remote add master elink@192.168.2.98:~/mq89/alps/abi/cpp.git
    git push master --all

2.2.2

克隆远程manifest.git目录,在mq89_std目录下

1
git clone elink@192.168.2.98:~/mq89/manifest.git

此时

1
2
ls mq89_std
alps manifest

注:关于代码中哪些目录需要建立git仓库

原则:为了方便以后代码的管理,如果在一个目录下拥有多个子目录,并且除去子目录以外没有其他文件,应该在各个子目录中分别建立git仓库。如,alps/mediatek的各个子目录。
还有我们应该按平台区分目录,在各个目录下创建git仓库,如,alps/mediatek/platform目录。我们应该在其下 的common和mt6589这2个目录分别建立git仓库,这样更方便以后的代码更新和管理

3. repo的管理

3.1 新建default.xml文件

在manifest目录下新建default.xml文件,此文件是repo管理的所有git仓库(project)
内容如下:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <remote  name="alps"
           fetch="DIR" />
    <default revision="master"
           remote="alps"
           sync-j="4" />
    <project path="alps/ndk" name="alps/ndk" />
</manifest>

注:

fetch后面的双引号填写代码存放的路径,remote name 和default remote的内容需相同,default revision指 远程的分支,这里填写的是默认分支master,sync-j表示的开启的线程数。
project内容的path变量表示本地存放的目录,name表示服务器相关git的存放路径,即DIR/alps/ndk/

3.2 git add default.xml并提交

1
2
3
4
5
cd mq89_std/manifest
git add default.xml
git commit -am "prompt"
git remote add master elink@192.168.2.98:~/mq89/manifest.git
git push master --all

注:每次的更改都需要提交default.xml文件

4. 客户端的下载

比如下载到repo-client文件夹中

1
2
3
cd repo-client
repo init -u [repo-server's directory]/manifest.git
repo sync

即可以下载完成

5. 关于copyfile的使用

前面有提到过git仓库创建的原则,比如alps/mediatek/platform目录下,需要对common和mt6589,2个目录各创建一个git仓库,但是在alps/mediatek/platform下存在Android.mk和rules.mk 文件,如果只在common和mt6589这2个目录中建立仓库则会导致无法下载这2个mk文件,所以推荐的方法是在alps/mediatek/platform下面创建目录mtk,并将Android.mk和rules.mk这2个文件复制过去,下载的时候就可以通过copyfile去实现了

1
2
3
4
<project path="alps/mediatek/platform/mtk" name="alps/mediatek/platform/mtk/" >
    <copyfile src="Android.mk" dest="alps/mediatek/platform/Android.mk" />
    <copyfile src="rules.mk" dest="alps/mediatek/platform/rules.mk" />
</project>

同理alps下面的几个文件也是一样的情况,可以在build中穿件mtk文件夹

1
2
3
4
5
6
<project path="alps/build" name="alps/build/" >
    <copyfile src="mtk/Makefile" dest="alps/Makefile" />
    <copyfile src="mtk/makeMtk" dest="alps/makeMtk" />
    <copyfile src="mtk/mbldenv.sh" dest="alps/mbldenv.sh" />
    <copyfile src="mtk/mk" dest="alps/mk" />
</project>