Repo 使用詳解

Repo 是一款工具,可讓您在 Android 環境中更輕鬆地使用 Git

 

安裝GIT

省略

 

安裝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

 

初始化Repo客戶端

安裝 Repo 後,設置您的客戶端以訪問 Android 源代碼代碼庫:
1.創建一個空目錄來存放您的工作文件。如果您使用的是 MacOS,必須在區分大小寫的文件系統中創建該目錄。爲其指定一個您喜歡的任意名稱:

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

2.使用您的真實姓名和電子郵件地址配置 Git。要使用 Gerrit 代碼審覈工具,您需要一個與已註冊的 Google 帳號關聯的電子郵件地址。確保這是您可以接收郵件的有效地址。您在此處提供的姓名將顯示在您提交的代碼的提供方信息中。

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

3.運行 repo init 以獲取最新版本的 Repo 及其最近的所有錯誤更正內容。您必須爲清單指定一個網址,該網址用於指定 Android 源代碼中包含的各個代碼庫將位於工作目錄中的什麼位置。

$ repo init -u https://android.googlesource.com/platform/manifest

初始化repo成功
我們要管理自己的倉庫,所以要建立一個自己的manifest.git

 

建立自己的manifest.git

1.打開 WORKING_DIRECTORY 文件夾
2.進入.repo文件夾
3.進入manifest文件夾,修改其中的defaule.xml文件
大體格式如下:

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

<manifest>
    <remote name="local" fetch="git://localhost/" />
    <default remote="local" revision="master"/>
    <project path="hello" name="helo"/>
</manifest>

可以看到,根元素manifest,裏邊定義了remote,default,project.
remote可以多個,每個定義了一個遠程拉取倉庫, fetch是倉庫的url, 可以使用”..”表示使用repo init -u url裏的url
default則設置每個項目的默認倉庫和默認分支
project定義了一個項目,它指明一個遠程倉庫,和clone到本地來後的目錄名稱. name爲項目的遠程倉庫名,以上代碼拉取的項目是git://localhost/helo

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="git://[http://xxx.xxx.xxx**]" name="origin" review="[http://xxx.xxx.xxx:8080**](https://link.zhihu.com/?target=http%3A//xxx.xxx.xxx%3A8080/)"/>
<default remote="origin" revision="main_dev"/>
<project name="platform/mediatek/modem/buildscript" path="buildscript">
<copyfile dest="m" src="m"/>
<copyfile dest="Make.bat" src="Make.bat"/>
<copyfile dest="make.pl" src="make.pl"/>
<copyfile dest="make.sh" src="make.sh"/>
<copyfile dest="M.bat" src="M.bat"/>
<copyfile dest="BuildMMAA.pl" src="BuildMMAA.pl"/>
</project><project name="platform/mediatek/modem/driver" path="driver"revision="352b1d8fb184a0169c6a17b5f6a858730fc51966"upstream="main_release" />
<project name="platform/mediatek/modem/make" path="make"revision="main_release" />
<project name="platform/mediatek/modem/middleware" path="middleware"revision="tag_20160316" />
<project name="platform/mediatek/modem/modem" path="modem" />
<project name="platform/mediatek/modem/mtk_rel" path="mtk_rel"/>
<project name="platform/mediatek/modem/custom" path="custom"/>
<project name="platform/mediatek/modem/tools" path="tools"/>
<project name="platform/mediatek/modem/interface" path="interface"/>
<project name="platform/mediatek/modem/service" path="service"/>
</manifest>

先看remote部分,fetch是服務器地址,可以用“..”來代替;name是默認的remote name,就是git push origin裏面那個origin;review是gerrit地址(這點是我猜的,不確定)。然後是default部分,裏面定義了默認的remote和revision。下面是project部分,這部分定義了整包代碼由哪些git組成。name是git在服務器上的相對路徑,path是把代碼下載下來後在本地的相對路徑,path是可以省略的,如果省略那麼就認爲path和name一樣,revision是指下載下來的代碼要checkout到哪個revision上,這裏的revision可以是commit id、branch name、tag name,反正本質上都是commit id。利用branch name的特性,revision寫branch name的話,那總可以下載到並且checkout出該branch上最新的代碼,default.xml中通常用branch name做revision。而commit id和tag name就是固定的某個commit了。如果revision用commit id的話,那後面必須跟上upstream,upstream的值是個branch name。revision部分如果省略的話,就等於使用default部分定義的revision。project還有個group屬性,但我沒實際用過,就不展開了。還有copyfile部分,這是用來處理一些無法或者不方便直接歸類到某個git中去的文件的,譬如項目代碼根目錄下的幾個零散文件,這幾個文件所在目錄做成一個git的話,等於把整包代碼做成了一個git。雖然git是可以嵌套的,但這樣不方便。repo的做法是將這些文件先放到某個已知git中去,本例就是先放到project buildscript裏面去。當然,放到某個git裏去的動作是由你來做的。然後下載完後再將它們copy到應該在的地方,本例就是根目錄下。dest是相對於根目錄的路徑,src是相對於project path的路徑。

要管理的倉庫 要管理的倉庫是普通的git. 當以上一切準備完畢. 我們就可以

$ repo sync

遠程倉庫被拉取到了本地.

 

創建xxx項目對應的分支

從遠程庫同步下來的項目是沒有分支的,所以必須要創建xxx項目的分支

$ repo start xxx --all 

(--all意爲將所有模塊都歸爲當前xxx分支下)

例如:

$  repo start  stable  platform/build platform/bionic

假設清單文件中設定的分支是gingerbread-exdroid-stable,那麼執行以上指令就是對platform/build、platform/bionic項目,在gingerbread-exdroid-stable的基礎上創建特性分支stable

 

查看當前項目代碼所在的分支

$ repo branch

例如:

 

刪除不用的本地分支

$ repo abandon 分支名 [<project>…]

 

刪除已經合併分支

$ repo prune [<project>…]

實際上是對git branch –d命令的封裝,該命令用於掃面項目的各個分支,並刪除已經合併的分支

 

切換分支

$ repo checkout <branchname>  [<project>…]

實際上是對git checkout 命令的封裝,但不能帶-b參數,所以不能用此命令來創建特性分支。

 

查看修改

$ repo diff [<project>…]

 

提交和上傳代碼

a) 如果本地有代碼修改,需要提交,請到相應的工作目錄,按照git的commit方式提交,上傳的時候才需要用到repo
b) 如果改動的工程較多,建議用repo stage命令來增加文件的track動作,但是提交就要到相應的目錄裏面老老實實的用git commit來提交了。
c) Repo upload 命令在上傳代碼時,僅是上傳到gerrit,還需要進行review後纔會在代碼庫中體現。格式爲 repo upload --re=zan.wang kernel。這裏的kernel爲project名稱。這裏的--re添加review人員命令,我試過是無效的,不知道是否是本地服務器有問題。Upload過程根據屏幕提示,確認幾次。成功後,到172.16.99.44:8080 gerrit服務器添加審覈人員。
d) 如果遠程的git庫有可寫權限,也可以在每個project下面用git進行提交,不過目前僅是可讀權限,如果個別人員開放了寫權限,可以進行此操作,和單獨操作git庫無異。
e) 目前i800JB項目的remote名稱爲phicomm,可以查看在manifests庫裏面的i800JB.xml文件。用git上傳某個project的修改時需注意這裏的remote爲phicomm,而非origin。

 

把文件添加到index表中

實際是對git add --interactive命令的封裝、用於挑選各個項目工作區中的改動以加入暫存區。

$ repo stage -i [<project>…]

-i代表git add --interactive命令中的--interactive,給出個界面供用戶選擇

 

上傳本地提交至服務器

$ repo upload

 

查看文件狀態

$ repo status

 

向服務器提交代碼

repo push <remotename> [--all |<project>…]

 

merge(合併多個分支)

repo forall –p –c git merge topic

 

tag(打標籤)

爲單個項目下打標籤

repo forall  [<project>...] –c git tag crane-stable-1.6

在所有項目下打標籤

repo forall –c git tag crane-stable-1.6

 

顯示manifest文件內容

$ repo manifest

 

顯示repo的版本號

$ repo version

 

repo自身的更新

$ repo selfupdate

 

查看本地repo管理的所有projects

$ repo list

 

Repo版本回退

所有倉庫回退

$ repo forall -c 'commitID=`git log --before "2017-03-17 07:00" -1 --pretty=format:"%H"`; git reset --hard $commitID'

參數說明:
forall  操作分支中的所有倉庫
-c  只操作當前分支
--before  早於指定時間點的提交記錄
-1  只顯示最近的1條記錄(注意這是數字 1 ,如果要顯示 2 條就寫 2,以此類推)
"2017-03-17 07:00"  希望回退到的日期(時間點)
--pretty  以指定格式顯示提交記錄%H  提交記錄的hash值,即commit id(其它格式及更詳細的信息可以使用命令git log --help打印幫助信息並查看“PRETTY FORMATS”小節)命令含義: 這條repo命令的實質就是在當前分支的每個倉庫下執行[Git] log命令,找出該倉庫下符合時間條件的第一個提交記錄,然後對該倉庫執行[git]+ reset --hard操作。就這麼簡單。
某幾個或者某幾個倉庫的版本回退

$ repo forall  [<project>...] -c 'commitID=`git log --before "2017-03-17 07:00" -1 --pretty=format:"%H"`; git reset --hard $commitID'

原文鏈接:https://www.jianshu.com/p/9c57696165f3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章