簡體   English   中英

回購初始化一個特定的提交

[英]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 使用的清單的修訂版,而不是清單所引用的任何項目中的修訂版。

  • 將參考回購的 state 轉儲到清單文件
  • 將文件復制到副本倉庫的.repo/manifests/
  • 使用該 static 清單在副本回購中進行同步。
[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM