1、repo介绍:
repo是Android为例方便管理多个git库开发的Python脚本。例如,Android源码很大很大,目录结构也很复杂,如果将其init成一个Git库,那就完了;git无法将整个库中间的某个目录单独clone出来,所以如果要下载代码,就必须下载全部代码。所以需要分模块,把根目录下的每个目录做成单独的Git库;那么编译时如何知道工程版本包含的库呢?那么还需要对工程库进行一个记录,记录每个版本使用了那些库
2、工作原理:
repo就是管理当前单独的那个Git库,所以关注点在当前Git的数量、名称、路径等;并且集中维护所有Git库的清单——manifests库,默认default.xml
如何管理所有Git库呢?靠里面名称为repo的库,repo库包含了一系列脚本
当repo init时,会从远程把manifests和repo两个Git库拷贝到本地,执行的目录下隐藏目录.repo目录里查看
3、default.xml介绍
问题:如果本地新增或替换git库修改了default.xml那么岂不是会和远程的default.xml冲突?
答案:repo防止这种情况,提供了local_mainfests库,其定制和default.xml一样,文件名也可以自定义,比如local_manifest.xml或another_local_manifest.xml,只需要将定制的xml防止其目录(原名local_mainfests),repo就会遍历该目录的所有xml文件,最终和default.xml合并成一个总的项目文件manifest.xml
工作环境中的mainfest.xml是结合mainfest目录生成的
主要包含两个部分:
<remote>:描述远程仓库的信息,name为远程仓库的名称(通常命名为origin),fetch是项目名称的前缘,review描述的是code review的server地址
<project>:每个repo管理的git库,remote和name都是描述名字,revision是分支,project_config配置为0(也就是没有),path是指目录
local_manifest.xml文件
同上文一样
4、chang_log
仓库目录保存的是历史信息和修改记录,工作目录保存的是当前的版本信息
repo支持将一个项目的Git仓库目录和工作目录分开来放
manifests:一份(.repo/manifests/,git/)还有一份./repo/manifests.git/
repo:在.repo/repo的.git目录下
project:所有管理的Git库目录分开存放位于.repo/projects/下,同时保留repo/.git(里面文件都是.repo链接),这样既分开存放也兼容所有git命令
5、命令介绍
help、init、sync、upload、diff、download、forall、prune、start、staus
1、init
repo init -u <URL> [<OPTIONS>]
-u 指定manifests远程git的URL(里面默认只有default.xml一个文件)【工作目录内两个文件内容一样】
-m 是-manifest-name的简称,指定所需要的manifests库中的清单文件(默认default.xml或maniftests.xml)
-b 是-manifest-branch的简称,指定分支
2、sync
repo sync [PROJECT_LIST]
-j 多线性同步操作,默认为4
-c 缩写-current-branch,只同步指定的远程分支。默认同步所有分支
-d 缩写detach,脱离当前的本地分支,切换到manifest.xml中设定的分支
-f 缩写force-broken,当git sync失败,不中断操作,继续同步其他的git库
-no-clone-bundle,同步操作会通过CDN与就近的服务器建立连接,使用HTTP/HTTPS初始化git库
3、upload
repo upload [PROJECT_LIST]
将本地代码上传到远程服务器
4、download
repo download <TARGET> <CHANGE>
从服务器上下载改动
5、forall
repo forall [PROJECT_LIST] -c <COMMAND>
对指定库执行-c参数的命令
6、prune
repo prune [<PROJECT_LIST>]
删除project中已经合并的分支
7、start
repo start <BRANCH_NAME> [<PROJECT_LIST>]
在指定的project上,切换到BRANCH_NAME分支
8、status
repo status [<PROJECT_LIST>]
查看多个git的状态