在 android 源码中,主要用 Repo 和 Git 来进行版本管理。Repo 是一个由谷歌构建,运行在 Git 之上的仓库管理工具,其让多项目管理变得更容易,尤其对于基本的网络操作,譬如,下载由上百个项目组成的 Android 源码。
Repo 的组成和基本使用
Repo launcher
Repo 的第一部分,其是一个 Python 脚本,主要用来获取完整的 Repo 工具并转发接收到的命令 .
Repo 的第二部分,由 Repo launcher 下载到 $srcDir/.repo/repo,其是主要功能部分,处理 Repo launcher 转发的命令。
官方的获取方式
1 2 3 4 5 6 7 8 9
| mkdir ~/bin PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
or
sudo apt-get install repo
|
官方源码下载方式
1 2
| repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 repo sync [-c --no-tags]
|
Repo 怎么工作
下载代码时 repo 主要工作流程如下:
repo init 在当前路径创建 .repo 文件夹并克隆 repo 的 git 仓库到 .repo/repo(即 Repo Tool)。
- 以
--bare 方式克隆 -u 选项指定的 git 仓库(没有工作空间的仓库)到 .repo/manifests.git。
- 创建
.repo/manifests 目录,创建 .repo/manifests/.git 到 .repo/manifests.git 的符号链接,将 manifests 转换为 Git 仓库。
- Checkout
-b 选项指定的分支,并创建 .repo/manifests 目录中的指定文件(通过 -m 指定,通常默认为 .repo/manifests/defualt.xml)的符号链接 .repo/manifest.xml。
repo sync 将 manifest.xml 和 local_manifest.xml 中每一个 project 的 git 仓库克隆到 .repo/projects。
- 通过链接到相应空仓库的
.git 创建工作路径, checkout manifest 中指定的分支,并更新 .repo/project.list。
项目存在的情况下, 一般执行 git pull [--rebase]来下载更新源码。
repo init的大体流程上如下:
1 2 3 4 5 6 7 8 9 10 11
| repo init -u $URL -b $BRANCH -m $MANIFEST -------------------- mkdir .repo; cd .repo git clone https://android.googlesource.com/tools/repo git clone --bare $URL manifests.git mkdir -p manifests/.git; cd manifests/.git for i in ../../manifests.git/*; do ln -s $i .; done cd .. git checkout $BRANCH -- . cd .. ln -s manifests/$MANIFEST manifest.xml
|
我们可以通过 repo --trace init ... 来追踪执行过程
VCS(Version Control System) 的使用
常见工作流程
- repo start 创建一个新的 topic 分支
- git add
- git commit
- repo upload (or: git push origin HEAD:refs/for/branch)
常见工作命令
| Command |
Description |
| repo init |
Initializes a new client. |
| repo sync |
Syncs the client to the repositories. |
| repo start |
Starts a new branch. |
| repo status |
Shows the status of the current branch. |
| repo upload |
Uploads changes to the review server. |
| git add |
Stages the files. |
| git commit |
Commits the staged files. |
| git branch |
Shows the current branches. |
| git branch [branch] |
Creates a new topic branch. |
| git checkout [branch] |
Switches HEAD to the specified branch. |
| git merge [branch] |
Merges [branch] into current branch. |
| git diff |
Shows diff of the unstaged changes. |
| git diff –cached |
Shows diff of the staged changes. |
| git log |
Shows the history of the current branch. |
| git log m/[codeline].. |
Shows the commits that aren’t pushed. |
help
1 2 3 4
| man repo repo help repo help <cmd> repo <command> --help
|
Topic Branch
一般我会在本地创建不同的 topic 分支来维护不同的修改,
Creating topic branches
1
| $ repo start branchname .
|
To check new branch
To assign the branch to a particular project
1
| $ repo start branchname project
|
切换分支
1
| $ git checkout branchname
|
To see a list of existing branches
1 2 3
| $ git branch or... $ repo branches
|
Reference
stack overflow.
Source Control Tools.