[英]repo init a particular commit
我正在為 Nexus S 手機 (samsung crespo) 構建 Cyanogenmod 9 (Android ICS) 系統。 問題是如果我這樣做:
repo init -u git://github.com/CyanogenMod/android.git -b ics
回購初始化到 ICS 的最新提交,其中清單不包括我需要的一些設備/三星/項目(特別是https://github.com/CyanogenMod/android_device_samsung_crespo )。
我如何將 init 回購到特定的提交? 在我的例子中,我希望最后一次提交使用 google android-4.0.3_r1 分支。 這是一個:
如果我做
repo init -u git://github.com/CyanogenMod/android.git -b commit-hash
不起作用,似乎 repo init -b 只支持分支的 HEAD。
提前致謝。
我想到了。 如果您在清單文件(例如 version.xml)中有一個標簽。 您可以使用以下命令將 init 重新存儲到特定標簽:
repo init -u <addres> -b refs/tags/<tagname> -m version.xml
長答案:
您不能為repo
指定分支名稱(或 SHA 或其他任何名稱),它不起作用。 原因如下:
repo
是一個處理存儲庫項目集合(實際上是獨立的 git 項目)的腳本。 項目列表位於.repo
git 中,並包含一個清單文件,該文件基本上是所有存儲庫 git 及其分支的列表。 -b
只適用於相關的repo
過程中的git repo init
。
這是.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
git 中創建local_manifest.xml
文件,在那里添加缺少的 git,然后從存儲庫的根目錄進行repo sync
。 有關local_manifest.xml
用法的更多信息在這里。
我沒有足夠的權限提交評論,但我只是想澄清 Andrejs Cainikovs 的回答。
除了作為 -b 選項的參數的分支 ref 之外,Repo還接受 commit-id SHA 。
正如答案所暗示的那樣,此參數指定了應由 repo 使用的清單的修訂版,而不是清單所引用的任何項目中的修訂版。
.repo/manifests/
[reference_repo]$ repo manifest -r -o static_manifest.xml
[copy_repo]$ rsync -a /path/to/reference_repo/static_manifest.xml /copy_repo/.repo/manifests/
[copy_repo]$ repo sync -m static_manifest.xml
確保在 copy-repo 中將 static 清單復制到.repo/manifests/
目錄,並在repo sync
中僅通過文件名引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.