7

我正在为 Nexus S 手机(三星 crespo)构建 Cyanogenmod 9(Android ICS)系统。问题是,如果我这样做:

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

repo 指向 ICS 的最新提交,其中清单不包括我需要的一些 device/samsung/ 项目(特别是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。

提前致谢。

4

3 回答 3

9

我想到了。如果清单文件中有标签(例如 version.xml)。您可以使用以下命令将初始化 repo 到特定标签:

repo init -u <addres> -b refs/tags/<tagname> -m version.xml
于 2013-10-28T14:04:36.547 回答
5

长答案:

您不能为 指定分支名称(或 SHA 或其他任何名称)repo,它将不起作用。原因如下:

repo是一个处理存储库项目(实际上是独立的 git)集合的脚本。项目列表位于.repogit 中,并包含一个清单文件,该文件基本上是所有存储库 git 及其分支的列表。-b仅与repogit 期间有关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,那么您可以local_manifest.xml在 git 中创建文件,在.repo其中添加缺少的 git,然后repo sync从存储库的根目录中添加。更多关于local_manifest.xml使用的信息在这里

于 2012-05-30T16:33:17.430 回答
3

我没有足够的权限提交评论,但我只是想澄清 Andrejs Cainikovs 的回答。

除了分支 ref 作为 -b 选项的参数之外,repo确实接受 commit-id SHA 。

正如答案所暗示的那样,此参数指定了 repo 应使用的清单的修订版,而不是清单所引用的任何项目中的修订版。

于 2014-07-25T00:42:38.320 回答