git repo init一个特定的提交

vof42yt1  于 2023-08-01  发布在  Git
关注(0)|答案(5)|浏览(154)

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

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

字符串
repo初始化到ICS的最新提交,其中清单不包括我需要的一些设备/samsung/项目(特别是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。
提前感谢。

ioekq8ef

ioekq8ef1#

我想出来了如果您的清单文件中有一个标记(例如version.xml)。您可以使用以下命令将init重新存储到特定标记:

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

字符串

rks48beu

rks48beu2#

长回答:

不能为repo指定分支名称(或SHA,或其他任何名称),这将不起作用。原因如下:
repo是一个脚本,用于处理一组仓库项目(实际上是独立的git项目)。项目列表位于.repo git中,包含一个manifest文件,基本上是所有仓库git及其分支的列表。-b仅与repo init期间的repo 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项目都会指向一些提交,这些提交在manifest文件中指定:

<?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的更多信息在这里。

vuktfyat

vuktfyat3#

我没有足够的权力发表评论,但我只是想澄清安德烈·凯尼科夫的回答。
Repo除了接受分支引用作为-b选项的参数外,还接受commit-id SHA
正如答案所暗示的,这个参数指定了repo应该使用的清单的修订版本,而不是清单引用的任何项目中的修订版本。

5t7ly7z5

5t7ly7z54#

  • 将引用存储库的状态转储到清单文件
  • 将文件复制到复制存储库的.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中将静态清单复制到.repo/manifests/目录中,并仅通过repo sync中的文件名引用。

yxyvkwin

yxyvkwin5#

我不明白@Andrejs Cainikovs的回答-你可以指定一个分支名称或SHA到repo,它工作得很好。-b参数可以接受分支名称、标记(参见@Renaud Mathieu的回答)或SHA。
我认为他所说的是能够在命令行上指定清单本身。你不能这样做,但是你可以通过使用本地清单来覆盖现有清单-参见https://stackoverflow.com/a/75016579/264822。我在这里复制了这个例子:

mkdir -p .repo/local_manifests/
# Create .repo/local_manifests/local_manifest.xml

<manifest>
    <!-- add github as a new remote source -->
    <remote name="github" fetch="git://github.com" />

    <!-- remove project in default.xml -->
    <remove-project name="platform/bootable/recovery" />
  
    <!-- replace with new remote github -->
    <project path="bootable/recovery" name="CyanogenMod/android_bootable_recovery" remote="github" revision="cm-10.1" />

    <!-- add new project -->
    <project path="external/busybox" name="CyanogenMod/android_external_busybox" remote="github" revision="cm-10.1" />

</manifest>

字符串

相关问题