多仓库移植 MGit 管理 - 实操作

多仓库移植 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"
        }
    }
}

简单解释一下注意事项:

  • 需要注意的是,为方便管理,需要将主仓库MainProjectabs-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.jsondest字段配置。

你也可以在.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容