在用 repo status 命令查看 Android 源码的所有 git 仓库改动时,一般执行起来都比较慢,像是单线程执行,但实际上默认会启用2个选项来同步执行。

我们可以使用 repo status 的 -j 选项来指定执行时的多线程数目。查看 repo help status 对 -j 选项的帮助说明如下:

-j JOBS, --jobs=JOBS
number of projects to check simultaneously

Description
The -j/--jobs option can be used to run multiple status queries in parallel.

即,可以使用该选项来加快 repo status 命令的执行速度。例如 repo status -j 4

查看 .repo/repo/subcmds/status.py 的源码,如果没有提供 -j 选项,默认启用2个线程来执行,如下面的 default=2 所示:

p.add_option('-j', '--jobs',
             dest='jobs', action='store', type='int', default=2,
             help="number of projects to check simultaneously")

注意:repo status 命令启用多线程执行时,打印出来的信息概率会出现错乱,类似于下面的效果:

project test/vts-testcase/vndk/  branch local_branchproject toolchain/binutils/
branch local_branch

可以看到,上面的 project toolchain/binutils/ 本该另起一行打印,但是它跟前面的内容打印在了同一行。这是多线程同时输出导致的错乱。

之前编写 shell 脚本来过滤 repo status 命令的打印结果,想要打印只且打印发生了改动的信息,就遇到了这种输出信息错乱影响解析的情况

当时还奇怪没有用 -j 选项来指定启用多线程,为什么会有这个问题,查看 repo help status 的帮助信息,也没有说明默认会启用多线程。后来查看了上面的 repo 源码,才确认默认会启用2个线程来同步执行。

为了避免这种问题,建议在 shell 脚本里面用 repo status -j 1 命令明确指定为单线程执行,避免打印的信息错乱而影响解析。但是这样执行会比较慢,根据实际需求来取舍。


霜鱼片
446 声望331 粉丝

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