2013年10月23日 星期三

[Coding] repo & git 的使用方法

最近開始,由於公司規劃往Android方向靠攏,學習Android上所採用Repo和Git作為版本控制的工具就變成無法避免的課題。

什麼是Repo和Git?

Git是所謂的分散式版本控管系統,網路上可以查到很多相關資料,請善用Google,在此就只貼上維基百科的說明

要先知道,Android本身是一個大的work space,裡面包含非常多的git repository。為了方便管理這些git repository,Repo就是背負著這個責任所發明出來的。Repo是由Google用Python script所寫出來,專門用來使用Git的一套script,主要是用來下載、管理Android下所有的git repository。

Repo: 

使用Repo就大部分按照以下的格式
repo COMMAND OPTIONS

1、獲取相關幫助:

repo help COMMAND
例如:repo help init,就可以取得repo init的其他用法

2、repo init -u URL

用來在目前目錄安裝下載整個Android repository,會下建立一個".repo"的目錄。-u參數用來指定一個URL,從這個URL中獲取repository的manifest文件。
例如:repo init -u git://android.git.kernel.org/platform/manifest.git,獲取的manifest文件放在.repo目錄中,命名為manifest.xml。這個文件的內容其實就是Android work space下所有被git管理的git repository的列表!

如果你有仔細看,可以發現到.repo/manifests是個被git管理的repository,裡面放著所有的manifest文件 (*.xml)。而透過參數的設定,則可以指定要使用哪個manifest文件,甚至是該文件的不同branch。

-m:用來選擇獲取 repository 中的某一個特定的 manifest 文件。如果不具體指定,那麼表示為預設的 manifest 文件 (default.xml)
repo init -u git://android.git.kernel.org/platform/manifest.git -m dalvik-plus.xml

-b:用來指定某個manifest 分支。
repo init -u git://android.git.kernel.org/platform/manifest.git -b release-1.0

3、repo sync [PROJECT_LIST]

下載最新文件,更新成功後,文件會和遠端server中的代碼是一樣的。 可以指定需要更新的project , 如果不指定任何參數,則會同步整個所有的project。

4、repo upload [PROJECT_LIST]

上傳修改的代碼 ,如果你的代碼有所修改,那麼在運行 repo sync 的時候,會提示你上傳修改的代碼。所有修改的代碼分支會上傳到 Gerrit,Gerrit 收到上傳的代碼,會轉換為一個改動,從而可以讓人們來review 修改的代碼。

5、repo diff [PROJECT_LIST]

顯示尚未commit的改動差異

6、repo download target revision

下載指定的修改版本, 例如:  repo download platform/frameworks/base 1241 ,就是下載修改版本為 1241 的代碼。

7、repo start new_branch_name [PROJECT_LIST]

在指定的project中建立新的branch,並且切換到該branch上。

--all:代表指定所有的git projects

8、repo prune [PROJECT_LIST]

刪除已經merge好的project。

9、repo forall [PROJECT_LIST] -c COMMAND

針對指定的project執行所帶入的git command,例如:repo forall -c git reset --hard HEAD 就會將所有project中的改動全部都清掉。

10、repo status

顯示所有project的狀態

Git:

1. 把遠端的git project抓下來放在local
git clone [REMOTE_PROJECT_URL]

2. 之前有提到的,任何的改動都需要建立在branch之上,所以就得建立local branch
git branch [BRANCH_NAME]

如果local branch需要track遠端的branch,那就在後面加上remote branch
git branch [BRANCH_NAME] [REMOTE_BRANCH]

要知道有哪些remote branch,可以透過git branch -a,會列出所有(local和remote)的branch。
git branch -a
舉例來說:
$ git branch -a

* local_branch

  remotes/arm7/master

$ git branch local_branch_test remotes/arm7/master

3. 切換local branch
git checkout [BRANCH_NAME]

4. 列出所有的改動
git status

5. 把改動的檔案先放上modified list
git add [FILE_NAME]

 or 

git add [DIR_NAME]

6. 把modified list中的檔案,退掉改動
git checkout [FILE_NAME]

 or

git checkout [DIR_NAME]

7. 把所有project中的所有改動都退掉
git reset --hard HEAD

8. 將modified list中的改動一起commit到local branch
git commit

9. 將local branch上已經commit的改動退掉 (改動還留著)
git reset --soft HEAD^

10. 把commit的改動,放到remote branch
git push [REMOTE_PROJECT_URL] HEAD:refs/to/[REMOTE_BRANCH_NAME]

要怎麼知道remote branch name呢?
可以透過git remote show [REMOTE],例如下面的例子中的branch name就是master
$ git remote

mips

$ git remote show mips

* remote mips

  Fetch URL: [REMOTE_PROJECT_URL]

  Push  URL: [REMOTE_PROJECT_URL]

  HEAD branch: master

  Remote branch:

    master tracked

  Local branch configured for 'git pull':

    local_branch merges with remote master

張貼留言