在android系統開發的過程中,source code是由git來做代碼管理的。在android source code中有很多的git倉庫,如果單個去管理的話會比較麻煩。這就引入了repo。repo是用python寫的一個腳本,用來封裝git的操作。
下面就以android源碼爲例,介紹repo+git的搭建。
-
repo工具的安裝
對於普通用戶安裝repo的方法如下
1.新建~/bin,並且在系統變量中添加這個bin路徑
mkdir ~/bin
export PATH=~/bin:$PATH
2.下載repo腳本
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo -
manifest倉庫的建立
repo進行代碼管理是通過一個配置文件(xml文件)來進行的。默認情況這個配置文件是default.xml。位置爲:.repo/manifests
假設服務器地址爲:10.8.5.239
賬戶:git
1.首先在服務器端建立一個空的git倉庫,用來存儲manifest。
git init --bare manifest.git
2.從客戶端clone manifest倉庫
git clone [email protected]:/home/git/CDR8010/manifest/manifest.git
3.添加xml配置文件
xml配置文件格式如下:<?xml version="1.0" encoding="UTF-8"?> <manifest> <remote fetch="../" name="master"/> <default remote="master" revision="master"/> <project name="CodeAurora89xx/platform/vendor/askey/sdk_addonde" path="LA.UM.7.6.2/LINUX/android/vendor/askey/sdk_addonde" /> < /manifest>
remote fetch元素是用來指定代碼git倉庫所在的位置。這個位置是相對位置,相對manifest.git倉庫的位置。
default remote=代表是默認遠程代碼的分支,revision代表的reposync時要下載的分支名稱
project name=代表代碼在服務器中存放的位置
path=代表代碼從服務器中下載下來之後存放的位置 -
服務器端git倉庫的建立
由於android代碼是從google直接下載下來的。google默認也是通過git來管理android代碼。所以在.repo/manifest目錄下面就存在一個default.xml配置文件。那麼就根據這個xml文件來初始化自己的git倉庫。
由於android中的倉庫很多,所以寫一個腳本來初始化git倉庫#!/usr/bin/python3 import os import sys if len(sys.argv) == 1: print('錯誤!請傳入 xml 文件') elif len(sys.argv) > 2: print('錯誤!傳入參數太多') else: print('傳入的文件是 %s' % sys.argv[1]) with open(sys.argv[1], 'r') as fin: while True: linestr = fin.readline() if linestr == '': break if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)): #本行內容含有name信息 charistr1 = 'name="' charistr2 = '"' gitprojstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)] cmd = 'git init --bare %s.git' % gitprojstr os.system(cmd) print(cmd)
這個腳本就是讀取default.xml文件中的project name屬性來創建倉庫。
這樣服務器端的源碼倉庫就已經創建完成。 -
Android 源碼中添加自己的git配置
步驟3中已經將倉庫建立完成,下面就需要將本地代碼push到服務器端。但是源碼中是從google下載下來的。所以此時代碼中連接的代碼庫是google的。要想將本地的代碼push到自己的服務器上,就需要將這些庫添加自己服務器對應的庫。幸好repo提供了遍歷庫的功能。
在源碼目錄下面執行如下命令:
repo forall -c ‘git remote add CDR8010 [email protected]:/home/git/CDR8010/$REPO_PROJECT.git’
其中REPO_PROJECT對應的是project name。
這條命令執行完成之後,就在每個git庫中添加了自己的git倉庫。 -
推送本地代碼到服務器端git倉庫
到目前爲止,已經將代碼配置完成。接下來的工作就是將當前的代碼推送到自己的服務器上。
repo start master --all
repo forall -c ‘git push -u CDR8010 master’
上面第一條命令是將各個git倉庫建立一個master本地分支
第二條命令將會進入到每個git庫,之後將本地master代碼push到Skysoft分支對應的遠程git倉庫中
至此repo+git的環境就已經搭建完成。並且將代碼推送到遠程服務器中了。 -
從服務器repo download代碼
將代碼保存在服務器中的目的就是讓開發人員能夠從服務器中下載code。
下載code方法爲:
repo init -u [email protected]:/home/git/CDR8010/manifest/manifest.git
上述命令就是將步驟2中的manifest同步下來,畢竟裏面存放着git倉庫的信息。
接下來就是同步git倉庫中的代碼:
repo sync
下載完成之後就能編譯啦。
補充:
由於要從服務器端下載代碼,所以需要將本地服務器的public key添加到git server的authorized_keys中。