Repo——另一个Git协同模型
Git 的神奇之处在于,你可以用很多不同的方式来使用它,而不像 Subversion,只有集中式一种方式。
最近又发现了一个 Git 新的协同模型 —— Repo,这个协同模型对于一个项目用到了多个Git版本库的协同开发非常有效。
实际上,这是上周在给一个团队做 “Git培训” 时,发现该团队在 Android 开发中,需要使用 Repo 这个工具来维护 Android 代码。于是花了些时间研究,补充了新的一章到讲义中...
Repo 是 Google Android 项目的附属工具,用于维护 Android 超级复杂的 Git 库(150多个独立的Git库)。虽然 repo 属于 android 项目,但 repo 本身可以独立使用,可以作为独立的工具,被任何项目使用。
用一句话概括 Repo: Repo 让分散的各自独立的 Git 版本库整合为一个整体。
不是有 git submodule 么?为什么还会出现一个 repo 呢?主要的原因,我认为有:
- 子模组不能指向Git库的某一分支,只是指向某个 commit
- 这对于项目发布没有问题,子模组指向 commit,即相当于固定于某个版本(里程碑)
- 但是对于开发非常不方便 。子模组固定于某个 commit,相当于处于 detached HEAD 状态,必须切换到分支才能更改。但是子模组对应于git库的哪一个分支,子模组的实现不能给出答案
- 主版本库和各个子版本库各自独立操作,不能整体的查看状态,查看differ
- 通过一个 manifests git 库,维护一个 XML 文件:manifest.xml
- 这个文件相当于 submodule 的 .gitmodules 文件
- 记录着版本库的源地址,以及本地检出的路径
- 该XML文件超越 .gitmodules 之处在于,XML文件可以记录分支名,即检出版本库的哪一个分支到对应的目录中
- Repo 包含了一些和 git 相近的子命令,实际上是对 git 相应命令的封装以便提供多版本库支持
- branches 命令,可以显示各个分支名称在各个 git 版本库中的分布统计
- diff 命令,可以显示各个 git 库的代码差异
- start 命令,对所有版本库创建功能分支并切换分支
- 还有 rebase, stage, status, sync 等命令