repo init一个特定的提交

ren*_*zoe 5 git android github repository cyanogenmod

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

repo init -u git://github.com/CyanogenMod/android.git -b ics  
Run Code Online (Sandbox Code Playgroud)

回购最新提交的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.

提前致谢.

And*_*ovs 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>
Run Code Online (Sandbox Code Playgroud)

因此,获取特定构建的存储库源的正确方法是获取它的清单.
即,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>
Run Code Online (Sandbox Code Playgroud)

如您所见,这两个清单之间的唯一区别是存储库git的修订值.

简短回答:

您需要获取manifest_static.xml特定的构建.

或者,如果你只是缺少一些项目git,那么你可以local_manifest.xml.repogit中创建文件,在那里添加缺少的git,然后repo sync从你的存储库的根目录添加.有关local_manifest.xml使用的更多信息在这里.


Ren*_*ieu 5

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

repo init -u <addres> -b refs/tags/<tagname> -m version.xml
Run Code Online (Sandbox Code Playgroud)