2012-05-30 66 views
4

Im爲Nexus S手機(samsung crespo)構建Cyanogenmod 9(Android ICS)系統。 的問題是,如果我這樣做:repo init特定提交

repo init -u git://github.com/CyanogenMod/android.git -b ics 

回購inits最新提交ICS,其中清單不包括我需要一些設備/三星/項目(特別是https://github.com/CyanogenMod/android_device_samsung_crespo)。

我該如何重新初始化特定的提交? 在我的情況下,我想要使用谷歌android-4.0.3_r1分支的最後提交。 這是一個:

如果我做

回購的init -u git的://github.com/CyanogenMod/android.git -b提交哈希

不行,似乎repo init -b只支持一個分支的HEAD。

在此先感謝。

回答

5

龍答:

不能指定分支名稱(或SHA,或任何其他),以repo,它不會工作。原因如下:

repo是一個處理庫項目集合(實際上是獨立的git)的腳本。項目列表位於.repo git中,並且包含一個清單文件,它基本上是所有存儲庫git的分支和它們的分支的列表。 -b僅適用於repo init期間的repo git。

這裏是.repo/manifests/default.xml一個例子:

<?xml version="1.0" encoding="UTF-8"?> 
<manifest> 
    <remote fetch="git://address.com/" name="origin" 
      review="review.address.com"/> 
    <default remote="origin" revision="ics-something" sync-j="4"/> 
    <manifest-server url="http://manifests.address.com:8000"/> 
    <!-- sniff --> 
    <project name="platform/external/libxml2" path="external/libxml2" 
      revision="ics-common"/> 
    <project name="platform/external/zlib" path="external/zlib" 
      revision="ics-common"/> 
    <project name="platform/frameworks/base" path="frameworks/base" 
      revision="ics-something"/> 
    <project name="platform/packages/apps/Bluetooth" path="packages/apps/Bluetooth" 
      revision="ics-common"/> 
    <!-- sniff --> 
</manifest> 

因此,獲取存儲的片源尤其是構建正確的方法是獲得它的清單。
即,清單將包含SHA(或標籤,如果存在的話,它們實際上是相同的)而不是分支名稱。這樣,你的資料庫中的每一個Git項目將指向到一些承諾,這是目前最新最當構建被執行:

<?xml version="1.0" encoding="UTF-8"?> 
<manifest> 
    <remote fetch="git://address.com/" name="origin" 
      review="review.address.com"/> 
    <default remote="origin" revision="ics-something" sync-j="4"/> 
    <manifest-server url="http://manifests.address.com:8000"/> 
    <!-- sniff --> 
    <project name="platform/external/libxml2" path="external/libxml2" 
      revision="refs/tags/android-4.0.4_r1.1"/> 
    <project name="platform/external/zlib" path="external/zlib" 
      revision="refs/tags/android-4.0.4_r1.1"/> 
    <project name="platform/frameworks/base" path="frameworks/base" 
      revision="ecb41a77411358d385e3fde5b4e98a5f3d9cfdd5"/> 
    <project name="platform/packages/apps/Bluetooth" path="packages/apps/Bluetooth" 
      revision="621bae79f1a250e443eb83d1f473c533bea493dc"/> 
    <!-- sniff --> 
</manifest> 

正如你看到的,這兩個清單之間的唯一區別是存儲庫的git的修正值。

簡短的回答:

你需要獲得特定構建manifest_static.xml

或者,如果你只是缺少一些項目Git的,那麼你可以在.repo混帳創建local_manifest.xml文件,添加缺少的Git的那裏,然後從庫的根repo sync。更多關於local_manifest.xml的使用方法是here

+0

他們爲什麼不使用'git submodule'而不是.repo?似乎它是爲此而構建的...... –

+1

'repo'不僅僅是同步。它可以自動上傳到gerrit,創建分支,在不知道目標git的情況下下載更改等等。當然,這只是包裝腳本,並且從字面上看,所有事情都可以通過裸機來完成。但是,由於谷歌製作了「回購」,每個人都堅持:) –

3

我想通了。如果你在清單文件中有標籤(例如version.xml)。您可以回購初始化到一個特定的標籤使用下面的命令:

repo init -u <addres> -b refs/tags/<tagname> -m version.xml 
1

我沒有足夠的權限來提交意見,但我只是想澄清安德烈斯Cainikovs的答案。

回覆確實接受了一個commit-id SHA以及作爲-b選項參數的分支引用。

正如答案所示,此參數指定了應該由repo使用的清單的修訂版本,而不是清單所引用的任何項目中的修訂版本。