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-shallow
、git 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]
参考资料
- . 下载源代码. Android Open Source Project. [2019-02-22].↑
- . AOSP repo sync takes too long. . 2015-02-07 [2019-02-22].↑
- . Repo介绍. . 2015-06-25 [2019-02-22].↑
- . How to convert a Git shallow clone to a full clone?. . 2011-07-23 [2019-02-22].↑
- Magnus Bäck. “repo init -b branch; repo status” does not show you're on a branch. . 2014-10-17 [2019-02-22].↑
- Jakub Narębski, mipadi. How to tell which commit a tag points to in Git?. . 2009-12-07 [2019-02-22].↑
- . gitrevisions - Specifying revisions and ranges for Git. git. [2019-02-22].↑
- Jean-Baptiste Queru. how do I switch branches by repo. . 2013-02-19 [2019-02-22].↑
[…] 最好的办法是《repo工具笔记》里介绍的 […]
如果“repo报告分支”指的是输出各个仓库的当前分支的话,是可以的:
repo forall -c ‘echo “$REPO_PATH :$REPO_PROJECT: $REPO_RREV”‘
说明,repo有一些特殊的变量,常用的如下:
REPO_PROJECT:指定项目的名称
REPO_PATH:指定项目在工作区的相对路径
REPO_RREV:指定项目在克隆时的指定分支,manifest里的revision属性
REPO_LREV:指定项目最后一次提交服务器仓库对应的哈希值
谢谢分享!