多仓库移植 MGit 管理 - 实操作
MGit
MGit 是一款 Ruby 封装的基于 Git 的多仓库管理工具,可以高效的、同时的对多个 Git 仓库执行 Git 命令。 适合于在多个仓库中进行关联开发的项目,提高 Git 操作的效率,避免逐个执行 Git 命令带来的误操作风险。
链接: <u>https://github.com/baidu/m-git/</u>
实操
一、准备工作
- 配置SSH
- 安装
MGit
工具 - 拉取
demo
并体验
1、配置SSH
需要特别说明 使用MGit方式必须要配置SSH。
2、安装 MGit 工具
环境要求:
- 系统:支持 macOS、Ubuntu,暂时不支持 Windows
- Ruby版本: >= 2.3.7
$ gem install m-git
2、拉取demo
并体验(初始化多仓库—)
初始化多仓库使用 mgit init
命令;
类似于 Git 从远程 clone 新仓库, 会将多个仓库 clone 到本地;
下面通过一个 demo 体验一下 MGit 命令:
2.1 建议在一个新文件夹中拉取demo
$ mgit init -g https://github.com/baidu/m-git.git
2.2 体验一下mgit命令
$ mgit -l 显示所有mgit管理的仓库
$ mgit branch --compact 查看多仓库的分支
$ mgit status 产看仓库分支超前/落后情况
二、已有仓库迁移到MGit
管理
1、根据文档 配置 manifest.json
文件
配置manifest
文件,将要管理的仓库按照规定的格式放到这个文件中。
经过实测,我的manifest.json
文件如下:
{
# 主仓库git地址,mainProject.git不需要写
"remote": "git@gitee.com:yxxxxxxe",
"version":1,
"mgit-excluded": false,
// 子仓库的本地路径可以在这里统一设置
"dest": "../Developments",
"repositories": {
"MainProject": {
// 主仓库的本地路径最好重新设置
"abs-dest": "./",
"remote-path": "mainProject.git",
"config-repo": true
},
"SKSugarSwift": {
"remote": "git@github.com:yxxxxxxe",
"remote-path": "SKSugarSwift.git"
}
}
}
简单解释一下注意事项:
- 需要注意的是,为方便管理,需要将主仓库
MainProject
的abs-dest
路径,像文件中这样设置为跟 manifest.json 同目录下"abs-dest": "./"
。 - 如果主仓库的 abs-dest 不重新设置,那么所有仓库(主仓库跟所有子仓库)都将在 “../Developments” 路径下。
- 其它子仓库的
abs-dest
可以不设置,会自动在“../Developments” 路径下新建跟子仓库同名的文件夹,将子仓库的内容放到里面。 - 当然也可以不设置外层的
dest
字段,即将dest
字段留空,然后在主仓库和所有子仓库下的abs-dest
字段设置本地路径。
注意:这里的目录结构跟demo中的目录结构不一致。具体就是通过manifest.json
文件设置的。
2、将manifest.json
文件放到主仓库的目录下
- 主仓库也需要在
manifest
文件中配置,并且需要将主仓库的config-repo
字段配置为true
,即"config-repo": true
。 - 其它仓库称为子仓库。
3、测试
使用 mgit init -f manifest-path
命令测试 manifest.json 配置是否正常。
注意manifest-path
就是 manifest.json文件的路径
。
注意这个命令不会重复拉取主仓库,只会拉取所有的子仓库到当前目录,并在当前目录创建一个.mgit
文件夹
你可以在当前目录中看到每个仓库的源码,他们的路径可以通过 manifest.json
的 dest
字段配置。
你也可以在.mgit/source-git/
下看到所有仓库的.git
, 这是 MGit 对所有仓库的托管。
4、提交manifest.json
到远端仓库
本地测试成功后,你可以提交主仓库中的 manifest.json,推送主仓库的变更到远端。
可以连同.mgit
隐藏文件夹一同推送。
5、mgit方式管理
其实这里有2种使用方式,一是本地已经有主仓库了直接使用mgit,二是在新目录下直接使用mgit拉取并管理。
5.1 直接使用
经过第3步的测试,在manifest.json
文件同目录下已经自动生成了一个.mgit
的隐藏文件夹,在这个同目录下,就可以使用mgit命令了。
当使用任何一个正确的 mgit 命令时,它就会先帮你拉取远端仓库(如果本地路径不存在的话)。
需要特别注意的是,如果本地已经有主仓库,并且子仓库也在manifest.json
文件配置的路径中,那么在主仓库中使用mgit命令时,.mgit
隐藏文件夹内的source-git
文件夹内不会生成手动下载的子仓库的.git
隐藏文件夹,因为source-git
这个文件夹用来保存着使用mgit命令下载的子仓库的.git
隐藏文件夹。
如果所有子仓库都在对应目录下,甚至.mgit
隐藏文件夹内连source-git
文件夹都不会自动生成,因为所有子仓库都不是使用mgit命令自动拉取的。
5.2 新目录拉取
在一个新目录或者新设备上,安装了mgit之后,可以使用mgit的初始化仓库命令拉取一套新的多仓库在本地使用。
# mgit初始化多仓库命令
$ mgit init -g 主仓库地址
6、本地配置表 local_manifest 只共同操作特定子仓库
如果本地只需要操作某几个子仓库,其它仓库不需操作,可以通过创建local_manifest.json
临时修改多仓库配置,在不修改manifest.json的情况下对配置进行调整,达到只操作某几个子仓库的目的。
将字段mgit-excluded
设置为false
,即"mgit-excluded": false
。
local_manifest
的创建和配置方式请查看链接中的3.本地配置表local_manifest
。
https://github.com/baidu/m-git/blob/master/docs/config/manifest.md
bug 2023-04-08
在实践过程中,发现一个bug
1、使用 mgit init -g xxxxx.git 命令时,生成的本地目录结构与 manifest.json 中描述的不一致!
2、然后再次使用正确的 mgit 命令(如 mgit status),或者本地本来就有主工程,然后移植到 mgit 管理的话,就会自动拉取子仓库,这时候本地目录结构就与 manifest.json 中描述的一致了。
详见提的 issue:https://github.com/baidu/m-git/issues/14