一:repo簡介
Android使用Git進行代碼管理,而Repo命令行工具對Git命令進行了封裝,是在Git之上構建的工具(它其實是一個python腳本),方便管理多個git項目,從而更好地對代碼進行集中式管理。
repo使用過程分如下幾步:
1.運行repo init 命令,克隆Android的一個清單庫,這個清單庫是通過xml文件建立的版本清單庫。
2.清單庫中的manifest.xml文件,列出了各個版本庫克隆所需要的參數信息;包括版本庫的地址、工作區定義的目錄結構,以及分支的對應關系。
3.運行repo sync的命令,開始同步,即分別克隆xml文件中的版本庫數據到本地的工作區中。
4.對各個版本庫進行切換分支操作,切換到某個分支操作提交並push到遠程。
【【【主要操作步驟見紅色字體;請確保操作如下步驟之前在gerrit.dd.net的個人賬號下配置了本地機器的ssh public key】】】
二:配置ssh config
按如下方式在~/.ssh/config里配置:(若沒有config文件需要新建)
Host gerrit.dd.net
HostName gerrit.dd.net
User 你的gerrit賬戶名
IdentityFile ~/.ssh/id_rsa
PubkeyAuthentication yes
三:安裝repo:下載Repo只針對第一次使用。
1. 確認主目錄下存在 bin/ 目錄並已包含在路徑中:mkdir ~/bin PATH=~/bin:$PATH
2.下載Repo工具並設置可執行的權限: curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
3.這里的repo只是一個引導腳本而不是直接稱之為repo,因為repo大部分功能代碼都不在其中,下載的只是幫助這個repo程序繼續下載和加載的工具。
注:修改repo腳本參數的repo_url :REPO_URL ='ssh://gerrit.dd.net:29418/git-repo'
四:repo和清單庫的初始化
下載並保存repo引導腳本后,建立一個工作目錄,這個工作目錄將作為Android工作區目錄。在工作目錄中執行repo init -u <url>,完成repo完整的下載及項目清單版本庫的下載。
mkdir workspace cd workspace repo init -u ssh://gerrit.dd.net:29418/manifest --no-repo-verify (注意:manifest倉庫地址需要研發組內給出)
命令repo init要完成如下操作:
1.完成repo工具的完整下載,現在僅有的不過是repo 的引導程序。初始化操作會從repo腳本里設定的鏡像地址中克隆repo.git庫到當前的目錄下。一個隱藏的.repo目錄。
2.克隆創建的清單庫manifest.git(地址來自與-u參數),清單庫實際上只包含一個default.xml文件,這個XML文件定義了多個版本庫和本地地址的映射關系,是repo工作的指引文件。
3.克隆的清單庫位於.repo/manifests.git中,本地克隆到.repo/manifests。自己新建的git倉庫里邊就放了個簡單的default.xml文件:ssh://gerrit.dd.net:29418/manifest
repo引導腳本的init子命令可以使用下列和清單庫相關的參數:
-u:指定一個URL,其連接到一個maniest倉庫
-m :在manifest倉庫中選擇一個xml文件
-b:選擇一個maniest倉庫中的一個特殊的分支
--repo-url:設定repo的版本庫地址。
--repo-branch:設定需要檢出的分支。
--no-repo-verify:設定不要對repo的里程碑簽名進行嚴格的驗證。
--mirror:只在repo第一次初始化的時候使用,建立本地鏡像
五:同步項目
repo sync 默認同步xml文件中定義的所有倉庫,可以單獨指定sync哪個或哪些倉庫: repo sync name1 name2
如果某個工程從未同步過,repo sync相當於git clone。所有遠程倉庫的分支都會被拷貝到本地倉庫。
如果工程已經同步過,repo sync相當於: git remote update git rebase origin/branch
(注:branch是本地工程目錄當前分支。如果當前分支不是遠程倉庫任意分支的跟蹤分支,那么這個工程不會發生同步。相反,就會進行合並操作。合並中有沖突,使用Git相關命令處理。)
六:修改提交並push到遠程
cd進入到sync到本地的某個分支倉庫目錄,修改提交,git branch發現倉庫都是no branch狀態:push到遠程時用命令:git push origin HEAD:master
七:repo常用命令
a . repo init
b . repo sync
c . repo upload [ project-list ] :上傳修改的代碼 ,如果你本地的代碼有所修改,那么在運行 repo sync 的時候,會提示你上傳修改的代碼,所有修改的代碼分支會上傳到 Gerrit (基於web 的代碼review 系統), Gerrit 受到上傳 的代碼,會轉換為一個個變更,從而可以讓人們來review 修改的代碼。
d . repo diff [project list]:顯示提交的代碼和當前工作目錄代碼之間的差異
e . repo download :
f . repo forall -c “command”:這個命令會遍歷所有的git倉庫,並在每個倉庫執行-c所指定的命令(這個被執行的命令就不限於僅僅是git命令了,而是任何被系統支持的命令,比如:ls 、 pwd 、cp 等)
例如:repo forall –c “echo $REPO_PATH” repo forall –c “git reset –hard HEAD” 環境變量: REPO_PROJECT REPO_PATH REPO_REMOTE
g . repo prune [project list]: 實際上是對git branch –d命令的封裝,該命令用於掃描項目的各個分支,並刪除已經合並的分支,
h . repo start newbranchname [project list] :在指定工程倉庫創建一個當前所在遠程分支的跟蹤分支,並切到跟蹤分支。
i . repo status [project list] :顯示當前工作目錄的狀態或指定工程名或者工程路徑的狀態。
j . repo manifest -o default.xml -r :獲取倉庫的sha1值,並記錄在一個新的default.xml文件中
default.xml 示例:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<! -- remote元素設置遠程服務器屬性,可以為多個:name設置遠程服務器名,用於git fetch,git remote等操作;fetch 所有project的git url前綴;指定gerrit的服務器名,用於repo upload操作 -->
<remote name="origin" fetch="gerrit.dd.net" review="http://gerrit.dd.net"/>
<! -- default元素設定所有peoject的默認屬性值:revision為git分支名,如master或refs/heads/master;remote為某一個remote元素的name屬性值,用於指定使用哪一個遠程服務器;sync-j為sync操作時的線程數-->
<default revision="master" remote="origin" sync-j="4" />
<! -- project元素指定一個需要clone的git倉庫:path指定clone出來的git倉庫在本地的地址;name唯一的名字表示project,用於拼接生成項目 git倉庫的url;revision:指定需要獲取的git提交點,可以定義成固定的branch,或者是明確的commit 哈希值 -->
<project path="fanxiao/fanxiaotest1" name="MA/Applications/app-a" revision="master" />
<project path="fanxiao/fanxiaotest2" name="MA/Applications/app-b" revision="52cf9185ff1d" />
<project path="fanxiao/fanxiaotest3" name="fanxiaotest" revision="master"/>
</manifest>