我正在为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。
先谢谢。
答案 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应该使用的清单的修订,而不是清单所引用的任何项目中的修订。