[英]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 使用的清单的修订版,而不是清单所引用的任何项目中的修订版。
.repo/manifests/
[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.