Android repo技巧:详解repo sync如何单独同步一个或多个仓库

霜鱼片

执行 repo sync 命令默认会同步 Android 源码的所有 git 仓库。如果想要单独同步一个、或多个 git 仓库,可以提供一个、或多个 project 参数来指定要同步的 git 仓库路径。具体命令格式如下:

  • Usage: repo sync [<project>...]

关键是,如何知道某个 git 仓库对应的 project 参数值是什么,是 git 仓库所在的子目录名,还是 git 仓库在 repo 中保存的完整目录路径,或是其他?

经过实际测试发现,这里提供的 project 参数值是基于当前 shell 的工作目录寻址到目标 git 仓库的目录路径,而不是 git 仓库在 repo 中保存的完整目录路径,也不是 git 仓库的子目录名。

例如执行 repo status 命令打印了下面的 git 仓库信息:

project android/packages/apps/Settings/ branch branch_m
 -m     res/values-zh-rCN/strings.xml

可以看到,这个 git 仓库在 repo 中保存的完整路径是 android/packages/apps/Settings/,所在的子目录名是 Settings

我们使用 cd 命令进入到 android 子目录,测试如下。

1.在当前的 android 子目录下执行 repo sync android/packages/apps/Settings/ 命令,会执行报错:

$ repo sync android/packages/apps/Settings/
error: project android/packages/apps/Settings/ not found

即,当前 shell 的工作目录在 android 子目录下,把要同步的 git 仓库在 repo 中的完整目录路径 android/packages/apps/Settings/ 作为参数传给 repo sync 命令,会执行报错,基于这个路径不能定位到要同步的 git 仓库。

2.传入 packages/apps/Settings/ 这个路径可以正常执行:

$ repo sync packages/apps/Settings/
Fetching project platform/packages/apps/Settings/

基于当前所在的 android 子目录,可以正常定位到所给 packages/apps/Settings/ 路径下的 git 仓库。

3.使用 cd 命令进入到 android/packages/apps/Settings/ 目录下,然后执行 repo sync . 命令不会报错:

$ repo sync .
Fetching project platform/packages/apps/Settings/

基于这几个测试结果可以发现,repo sync 后面跟着的 project 参数值应该是基于当前 shell 工作目录能够寻址到该 git 仓库的目录路径,类似于 cd 命令的路径寻址方式。

查看 repo help sync 命令打印的帮助信息,对 project 参数的说明如下,符合上面的验证结果:

'repo sync' will synchronize all projects listed at the command line. Projects can be specified either by name, or by a relative or absolute path to the project's local directory. If no projects are specified, 'repo sync' will synchronize all projects listed in the manifest.

即,可以提供 project name、或者提供能够寻址到该 project 本地目录的相对路径或绝对路径来指定要同步的 project。

这里说的 project name 并不是 git 仓库的子目录名,具体值要在 repo 命令生成的 .repo/ 目录下查看。例如,查看 .repo/ 目录下的 manifest.xml 文件,有如下信息:

<project groups="p-fs-release,pdk-fs" name="platform/packages/apps/Settings"
    path="android/packages/apps/Settings"  />

可以看到,Settings 子目录的 git 仓库在 repo 中保存的完整路径是 android/packages/apps/Settings,跟上面例子打印的信息相符。而它的 name 是 platform/packages/apps/Settings

那么只要当前 shell 的工作目录是 Android 源码的子目录,不管在哪个子目录下,执行 repo sync platform/packages/apps/Settings 命令都会同步 Settings 这个 git 仓库的代码,这里不再举例,可以自行验证。

阅读 17.3k

南木阁
考据党一枚,力求讲述的每个知识点都有出处,有理有据。如能恰好地解答您的疑问,欢迎点赞,谢谢!

解读权威文档,编写易懂文章。如有恰好解答您的疑问,多谢赞赏支持~

341 声望
312 粉丝
0 条评论
你知道吗?

解读权威文档,编写易懂文章。如有恰好解答您的疑问,多谢赞赏支持~

341 声望
312 粉丝
文章目录
宣传栏