repo工具笔记

2019年2月22日

官方的《Repo 命令参考资料》极不全面,很多选项没有!只能用repo help init,或者去https://gerrit.googlesource.com/git-repo/+/master/subcmds/init.py查看源代码。

repo克隆仓库(并检出分支)

[1]给出的命令是

repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r52
repo sync

这样非常慢!从源代码里发现repo init可接受选项--depth,就跟git clone --depth一样。如果不需要看以前的历史记录,设为1即可。repo sync可接受选项-c,表示只更新当前分支;--no-tags,不获取标签;-j2,用2个线程执行。

[2]建议再加--no-clone-bundle。根据[3]--no-clone-bundle是禁止从CDN下载,用了它速度反而会变慢吧。我猜测或许bundle本身就是整个仓库,因为一开始说了只需要depth=1,所以才禁用的吧。

优化后的命令是

repo init --depth 1 -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r52
repo sync -c --no-tags -j4

记得,如果以后想要获取更多历史记录,可以用git fetch --update-shallowgit fetch --shallow-since=15/11/2012--deepen=<depth>等多种选项。[4]

这样检出后,如果用git进单独的仓库查看,git会报告“Not currently on any branch.”,按照[5],这是正常的。

那怎么验证repo真的把每个项目都检出到android-8.1.0_r52分支了呢?命令

git rev-list -1 android-8.1.0_r52

或者

git rev-parse android-8.1.0_r52^{}

可以获取附注标签指向的sha1。[6]

这里,android-8.1.0_r52^{}表示android-8.1.0_r52应当是一个标签,^{}表示获取指针的内容,直到该内容的类型不再为标签。[7]

附注标签本身是一个对象,有sha1,该对象还有一个指针,指向目标版本号。

注,轻量标签本身就是版本号的别名,获取轻量标签的版本号可以省去^{},即

git rev-parse 0.2.2

当然为了一致性,以及不用区分轻量标签和附住标签,可以始终用git rev-parse tag^{}

以下脚本可以检测repo是否检出了正确的分支。用repo forall -c ~/Android-8.1.0/test-branch.sh android-8.1.0_r52调用。

#!/bin/bash

if [ "$(git rev-parse HEAD)" = "$(git rev-parse $1^{})" ]; then
	#echo "$(git rev-parse --show-toplevel) on branch $1"
	a=2
else
	echo "$(git rev-parse --show-toplevel) not on branch $1"
fi

注,如果写成repo forall -c test-branch.sh android-8.1.0_r52,repo会提示”Got an error, terminating the pool: OSError: [Errno 2] No such file or directory”。

如果脚本里不写#!/bin/bash,repo会提示”Got an error, terminating the pool: OSError: [Errno 8] Exec format error”。或者可以指明bash,即repo forall -c bash ~/Android-8.1.0/test-branch.sh android-8.1.0_r52

repo报告当前分支

repo不能报告当前分支。

repo切换分支

据说可以在现有仓库里用

repo init -b <new_manifest_branch>
repo sync -c --no-tags --no-clone-bundle -j4

不会重新克隆整个仓库。[8]

参考资料

  1. . 下载源代码. Android Open Source Project. [2019-02-22].
  2. . AOSP repo sync takes too long. . 2015-02-07 [2019-02-22].
  3. . Repo介绍. . 2015-06-25 [2019-02-22].
  4. . How to convert a Git shallow clone to a full clone?. . 2011-07-23 [2019-02-22].
  5. Magnus Bäck. “repo init -b branch; repo status” does not show you're on a branch. . 2014-10-17 [2019-02-22].
  6. Jakub Narębski, mipadi. How to tell which commit a tag points to in Git?. . 2009-12-07 [2019-02-22].
  7. . gitrevisions - Specifying revisions and ranges for Git. git. [2019-02-22].
  8. Jean-Baptiste Queru. how do I switch branches by repo. . 2013-02-19 [2019-02-22].