2013年9月30日 星期一

[轉 ]repo 的一些用法和理解

repo的用法(zz)


註:repo只是google用Python腳本寫的調用git的一個腳本,主要是用來下載、管理Android項目的軟件倉庫。(也就是說,他是用來管理給git管理的一個個倉庫的)
下載 repo 的地址: http://android.git.kernel.org/repo ,可以用以下二者之一來下載 repo
wget http://android.git.kernel.org/repo 
或者 
curl http://android.git.kernel.org/repo > ~/bin/repo  
下載完成後須修改repo的權限: chmod a+x ~/bin/repo 

用repo sync 在抓去 android source code 的時候,會經常出現一些錯誤導致 repo sync 中斷,每次都要手動開始。 可以用如下的命令,來自動重複
$?=1; 
while [ $? -ne 0 ] ; 
do  repo sync ; 
done

獲取幫助:
repo help [ command ]   //顯示command 的詳細的幫助信息內容
示例: repo help init 來獲取 repo init 的其他用法

repo init -u URL 用以在當前目錄安裝 repository ,會在當前目錄創建一個目錄 ".repo"  -u 參數指定一個URL, 從這個URL 中取得repository 的 manifest 文件。   
示例:repo init -u git://android.git.kernel.org/platform/manifest.git
獲取的manifest文件放在.repo目錄中。命名為manifest.xml。這個文件的內容其實就是所有被git管理的倉庫的列表!

可以用 -m 參數來選擇獲取 repository 中的某一個特定的 manifest 文件,如果不具體指定,那麼表示為默認的 namifest 文件 (default.xml)
repo init -u git://android.git.kernel.org/platform/manifest.git -m dalvik-plus.xml
(有諸多供我們選擇的manifest文件,所有的manifest文件都放在目錄.repo/manifests中,該目錄本身亦被git所管理,你可以cd進去看看)

可以用 -b 參數來指定某個manifest 分支。
repo init -u git://android.git.kernel.org/platform/manifest.git -b release-1.0
你會發現.repo/manifests是個被git管理的倉庫,這裡放的是所有的manifest文件(*.xml),因為被git管理,固然有分支,-b可以切換到你想要的分支然後再下載相關的xml文件,當然具體下載那個xml還要看-m參數了,所以如果你僅僅指定-b而沒有-m的話,就是下載-b指定分支下的default.xml文件
如果不指定-b參數,那麼會默認使用master分支

4. repo sync [project-list]
下載最新本地工作文件,更新成功,這本地文件和repository 中的代碼是一樣的。 可以指定需要更新的project , 如果不指定任何參數,會同步整個所有的項目。
如果是第一次運行 repo sync , 則這個命令相當於 git clone ,會把 repository 中的所有內容都拷貝到本地。 如果不是第一次運行 repo sync , 則相當於 git remote update ;  git rebase origin/branch .  repo sync 會更新 .repo 下面的文件。 如果在merge 的過程中出現衝突, 這需要手動運行  git  rebase --continue

5. repo update[ project-list ]
上傳修改的代碼 ,如果你本地的代碼有所修改,那麼在運行 repo sync 的時候,會提示你上傳修改的代碼,所有修改的代碼分支會上傳到 Gerrit (基於web 的代碼review 系統), Gerrit 受到上傳的代碼,會轉換為一個個變更,從而可以讓人們來review 修改的代碼。

6. repo diff [ project-list ]
        顯示提交的代碼和當前工作目錄代碼之間的差異。

7. repo download  target revision
        下載特定的修改版本到本地, 例如:  repo download pltform/frameworks/base 1241 下載修改版本為 1241 的代碼

8. repo start newbranchname .
        創建新的branch分支。 "." 代表當前工作的branch 分支。

9.  repo prune [project list]
        刪除已經merge 的 project

10. repo foreach [ project-lists] -c command
       對每一個 project 運行 command 命令

12. repo forall -c 
這個命令會遍歷所有的git倉庫,並在每個倉庫執行-c所指定的命令(這個被執行的命令就不限於僅僅是git命令了,而是任何被系統支持的命令,比如:ls 、 pwd 、cp 等等的 )
當我想通過這個命令遍歷所有的倉庫並在每個倉庫執行"git checkout . "用以將每個倉庫的改動都清除的時候,我這麼輸入命令:
repo forall -c git checkout . 
我發現這樣根本不行。看來repo不能遍歷執行checkout這個命令。今天我終於想到了另外一個命令"git reset --hard HEAD" 哈哈
repo forall -c git reset --hard HEAD
再說一個新發現:以前用repo forall 執行一些命令的時候,可能再遍歷到某個倉庫的時候出了問題,但是我卻苦於不知道這個倉庫到底是哪個!一直也沒有解決。今天終於找到了。。。。  關鍵時候還是要看命令自己帶的幫助手冊呀。。。
repo help forall  用這個命令查看下針對forall的幫助吧。說的很清楚,repo執行的時候加上-p參數就可以在遍歷到每個倉庫的時候先打印出當前的pwd,然後再繼續執行-c所指定的命令。舉例如下:
repo forall -p -c git branch    

//該命令會遍歷所有倉庫並打印每個倉庫的分支情況,由於有了-p參數,這樣便會打印出每個倉庫的路徑!!!

11. repo status
       顯示 project 中每個倉庫的狀態,並打印倉庫名稱。

201111071237 更新
yasin.lee.x 
———————————————————————————————————————————————————————
cpp@cpp:~$ repo
Traceback (most recent call last):
  File "/home/cpp/bin/repo", line 91, in ?
    import readline
ImportError: No module named readline
cpp@cpp:~$
———————————————————————————————————————————————————————
系統裡明明有readline,可是repo腳本卻無法導入,後來查到應該是python安裝導致的錯誤,應該在python編譯時加上關於readline的編譯選項,應該按照如下操作安裝python
首先安裝readline軟件包:
sudo apt-get install libreadline5-dev
sudo apt-get install zlib1g-dev
然後下載python源碼進入python源碼目錄,編譯並安裝python:
1. make distclean
2. ./configure  --enable-readline  BASECFLAGS=-U_FORTIFY_SOURCE
3. make -j4
4. sudo make install
注意,我同時發現在python-2.4.3版本是支持該編譯選項的,而在3.1.3版本中是不能識別這個--enable-readline編譯參數的。所以我目前使用2.4.3版本。

2013年8月5日 星期一

[轉] Android Property

Introduction Android Property 是系統的環境變數設定 這邊有一篇文章,寫得還不錯啦 http://blog.csdn.net/loughsky/archive/2008/11/14/3297286.aspx Android Property有點像我們windows的registery 個人是這樣的覺得 Android 裡面很多都有用到property_get/property_set的function來設定或獲得變數 你可以使用這邊的library: /device/lib/cutils int property_get(const char *key, char *value, const char *default_value); int property_set(const char *key, const char *value); 那當system起來的時候,會去Load幾個property的檔案 /default.prop /system/build.prop /system/default.prop /data/local.prop 每個裡面代表不同的設定值 很多Android的AP都會base on 這些property去做一些行為 而property又分幾種 01. "ro." : read only 02. "persist.": then when setting this property, the value will be written to /data/property, too. 03. "net." : when when setting this property, the “net.change” property will be set automatically to contain the name of the last updated property. 04. "ctl." :The property “ctrl.start” and “ctrl.stop” is used to start and stop a service. Android Tools 使用者可以使用這些指令來看系統目前的property設定 getprop setprop Good Luck!