repo init一个特定的提交

时间:2012-05-30 14:51:29

标签: android git github repository cyanogenmod

我正在为Nexus S手机(三星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重新发送到特定提交? 在我的情况下,我想要使用谷歌android-4.0.3_r1分支的最后一次提交。 是这个:

如果我这样做

  

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

不起作用,似乎repo init -b只支持分支的HEAD。

先谢谢。

3 个答案:

答案 0 :(得分:5)

答案很长:

您无法为repo指定分支名称(或SHA或其他任何内容),它将无效。原因如下:

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

答案 1 :(得分:4)

我明白了。如果您在清单文件中有标记(例如version.xml)。您可以使用以下命令将init重新启动到特定标记:

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

答案 2 :(得分:1)

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

Repo 除了将分支引用作为-b选项的参数外,还接受commit-id SHA

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