repo全解之自己搭建repo仓库

repo是什么

是什么: Repo是基于git的仓库管理工具,是一个python脚本
干什么: Repo整个很多的git仓库,可以做统一的上传,并且可以自动化部分Andoid开发流程

repo引导器

首先要说一下repo分为两部分, 一部分时一个名叫repo的python文件,另一部分是一个名叫repo.git这么一个git仓库.
而这个repo文件好像是一个引导器,一下命令下载它并设置它为可执行:

1
2
$curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  
$chmod a+x ~/bin/repo

此时,你可以运行一下它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$~/bin/repo  #你也可以把它添加到PATH里
error: repo is not installed. Use "repo init" to install it here.
```

提示没有安装repo
如果再执行以下命令:

``` bash
$~/bin/repo help

usage: repo COMMAND [ARGS]

repo is not yet installed. Use "repo init" to install it here.

The most commonly used repo commands are:

init Install repo in the current working directory
help Display detailed help on a command

For access to the full online help, install repo ("repo init").

提示你repo没安装,可以使用repo init安装.并且只支持两个子命令.
这就说明,这个repo文件是一个引导器,或者是安装器.
它要如何安装呢?

repo.git gpg签名

我们就按照它的提示来操作,运行:

1
2
3
$repo init #假设将repo添加到了PATH下
Get https://gerrit.googlesource.com/git-repo/clone.bundle
fatal: manifest url (-u) is required.

在等了一会儿后显示如上,可以看到它是从google的gerrit来下载repo.git仓库,最后提示repo init的用法是必须指定一个manifest的url,我们下一小节介绍.
在执行完这个命令后,会在当前目录创建一个目录.repo,在它里面有个目录repo,是从repo.git仓库检出的代码. cd到.repo/repo,git status,会发现时clone来的
为什么会去那个地址检出代码呢?
答案肯定在那个repo脚本里,在里面会有两个变量

1
2
REPO_URL = 'https://gerrit.googlesource.com/git-repo'
REPO_REV = 'stable'

分别是repo.git仓库的url和检出的branch. 如果我们要想让repo来clone我们自己的repo.git,则修改上边的变量就可以了. 那如何如何自己创建repo.git呢? 这是另一个问题.
此时再执行repo help:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$repo help
usage: repo COMMAND [ARGS]
The most commonly used repo commands are:
abandon Permanently abandon a development branch
branch View current topic branches
branches View current topic branches
checkout Checkout a branch for development
cherry-pick Cherry-pick a change.
diff Show changes between commit and working tree
diffmanifests Manifest diff utility
download Download and checkout a change
grep Print lines matching a pattern
info Get info on the manifest branch, current branch or unmerged branches
init Initialize repo in the current directory
list List projects and their associated directories
overview Display overview of unmerged project branches
prune Prune (delete) already merged topics
rebase Rebase local branches on upstream branch
smartsync Update working tree to the latest known good revision
stage Stage file(s) for commit
start Start a new branch for development
status Show the working tree status
sync Update working tree to the latest revision
upload Upload changes for code review
See 'repo help <command>' for more information on a specific command.
See 'repo help --all' for a complete list of recognized commands.

哇,命令这么多了!!
此时我们只是有了repo工具,但是要想管理多个git,还需要一个清单,来说明要管理那些git,从哪里拉去等等. 这个任务要依赖manifest.git了,正如之前提到的,在repo init的时候,要通过-u url来指定manifest.git的位置.

manifests.git

使用如下命令:

1
$repo init -u https://android.googlesource.com/platform/manifests

就会初始化repo成功.
但是我们要管理自己的仓库,所以要建立一个自己的manifests.git.
这个manifests的内容最简单时是一个default.xml.
default.xml内容如下:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?>

<manifest>
<remote name="local" fetch="git://localhost/" />
<default remote="local" revision="master"/>
<project path="hello" name="helo"/>
</manifest>

可以看到,根元素manifest,里边定义了remote,default,project.
remote可以多个,每个定义了一个远程拉取仓库, fetch是仓库的url, 可以使用”..”表示使用repo init -u url里的url
default则设置每个项目的默认仓库和默认分支
project定义了一个项目,它指明一个远程仓库,和clone到本地来后的目录名称. name为项目的远程仓库名,以上代码拉取的项目是git://localhost/helo

要管理的仓库

要管理的仓库是普通的git.
当以上一切准备完毕.
我们就可以

1
2
3
4
5
6
7
8
9
10
$repo sync
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From git://localhost/helo
* [new branch] master -> local/master

hello/: leaving master; does not track upstream
$ls
hello repo

远程仓库被拉取到了本地.

总结

其实吧, 我平时用了好多git库来存储笔记和项目, 我住的地方木有网络,然后我要从我的笔记和公司电脑同步数据,就只能通过u盘,于是就研究怎么clone本地的git仓库,当git仓库多了,我每次都要一个一个同步麻烦,所以就想到repo,因为之前做手机系统一直的时候用到过,然后就是捣鼓,当我最终弄出来的时候发现,没有review,我的提交根本递交不到我的git仓库里来,于是就无语了.不过呢,学到了东西.实际也是可以用它来同步的,只是有点杀鸡用牛刀了,不如写个简单的脚本.

一些问题

  1. repo只能用在Android吗?

参考

http://source.android.com/source/developing.html 使用repo
http://source.android.com/source/using-repo.html 使用repo
http://source.android.com/source/downloading.html#installing-repo 安装repo
http://project-management.diandian.com/post/2012-03-02/14242257 构建自己的repo.git
Git权威指南-第4篇-第25章-REPO
https://code.google.com/p/git-repo/source/browse/docs/manifest-format.txt?r=cd81dd6403fc8dbe6ec5920c517d9083902c3c1f 非常详细的介绍了manifest的格式