多倉庫移植 MGit 管理 - 實(shí)操作

多倉庫移植 MGit 管理 - 實(shí)操作

MGit

MGit 是一款 Ruby 封裝的基于 Git 的多倉庫管理工具,可以高效的、同時的對多個 Git 倉庫執(zhí)行 Git 命令。 適合于在多個倉庫中進(jìn)行關(guān)聯(lián)開發(fā)的項(xiàng)目,提高 Git 操作的效率,避免逐個執(zhí)行 Git 命令帶來的誤操作風(fēng)險(xiǎn)。
鏈接: <u>https://github.com/baidu/m-git/</u>

實(shí)操

一、準(zhǔn)備工作

  • 配置SSH
  • 安裝MGit工具
  • 拉取demo并體驗(yàn)

1、配置SSH
需要特別說明 使用MGit方式必須要配置SSH。

2、安裝 MGit 工具

環(huán)境要求:

  • 系統(tǒng):支持 macOS、Ubuntu,暫時不支持 Windows
  • Ruby版本: >= 2.3.7
$ gem install m-git

2、拉取demo并體驗(yàn)(初始化多倉庫—)

初始化多倉庫使用 mgit init 命令;

類似于 Git 從遠(yuǎn)程 clone 新倉庫, 會將多個倉庫 clone 到本地;

下面通過一個 demo 體驗(yàn)一下 MGit 命令:

2.1 建議在一個新文件夾中拉取demo

$ mgit init -g https://github.com/baidu/m-git.git

2.2 體驗(yàn)一下mgit命令

$ mgit -l                 顯示所有mgit管理的倉庫
$ mgit branch --compact   查看多倉庫的分支
$ mgit status             產(chǎn)看倉庫分支超前/落后情況

二、已有倉庫遷移到MGit管理

1、根據(jù)文檔 配置 manifest.json 文件

配置manifest文件,將要管理的倉庫按照規(guī)定的格式放到這個文件中。

經(jīng)過實(shí)測,我的manifest.json文件如下:

{
    # 主倉庫git地址,mainProject.git不需要寫
    "remote": "git@gitee.com:yxxxxxxe", 
    "version":1,
    "mgit-excluded": false,
    // 子倉庫的本地路徑可以在這里統(tǒng)一設(shè)置
    "dest": "../Developments",
    "repositories": {
        "MainProject": {
            // 主倉庫的本地路徑最好重新設(shè)置
            "abs-dest": "./",
            "remote-path": "mainProject.git",
            "config-repo": true
        },
        "SKSugarSwift": {
            "remote": "git@github.com:yxxxxxxe",
            "remote-path": "SKSugarSwift.git"
        }
    }
}

簡單解釋一下注意事項(xiàng):

  • 需要注意的是,為方便管理,需要將主倉庫MainProjectabs-dest路徑,像文件中這樣設(shè)置為跟 manifest.json 同目錄下"abs-dest": "./"。
  • 如果主倉庫的 abs-dest 不重新設(shè)置,那么所有倉庫(主倉庫跟所有子倉庫)都將在 “../Developments” 路徑下。
  • 其它子倉庫的abs-dest可以不設(shè)置,會自動在“../Developments” 路徑下新建跟子倉庫同名的文件夾,將子倉庫的內(nèi)容放到里面。
  • 當(dāng)然也可以不設(shè)置外層的dest字段,即將dest字段留空,然后在主倉庫和所有子倉庫下的abs-dest字段設(shè)置本地路徑。

注意:這里的目錄結(jié)構(gòu)跟demo中的目錄結(jié)構(gòu)不一致。具體就是通過manifest.json文件設(shè)置的。

2、將manifest.json文件放到主倉庫的目錄下

  • 主倉庫也需要在manifest文件中配置,并且需要將主倉庫的config-repo字段配置為true,即 "config-repo": true。
  • 其它倉庫稱為子倉庫。

3、測試

使用 mgit init -f manifest-path 命令測試 manifest.json 配置是否正常。
注意manifest-path 就是 manifest.json文件的路徑。

注意這個命令不會重復(fù)拉取主倉庫,只會拉取所有的子倉庫到當(dāng)前目錄,并在當(dāng)前目錄創(chuàng)建一個.mgit文件夾

你可以在當(dāng)前目錄中看到每個倉庫的源碼,他們的路徑可以通過 manifest.jsondest字段配置。

你也可以在.mgit/source-git/ 下看到所有倉庫的.git, 這是 MGit 對所有倉庫的托管。

4、提交manifest.json到遠(yuǎn)端倉庫

本地測試成功后,你可以提交主倉庫中的 manifest.json,推送主倉庫的變更到遠(yuǎn)端。
可以連同.mgit隱藏文件夾一同推送。

5、mgit方式管理

其實(shí)這里有2種使用方式,一是本地已經(jīng)有主倉庫了直接使用mgit,二是在新目錄下直接使用mgit拉取并管理。

5.1 直接使用

經(jīng)過第3步的測試,在manifest.json文件同目錄下已經(jīng)自動生成了一個.mgit的隱藏文件夾,在這個同目錄下,就可以使用mgit命令了。

當(dāng)使用任何一個正確的 mgit 命令時,它就會先幫你拉取遠(yuǎn)端倉庫(如果本地路徑不存在的話)。

需要特別注意的是,如果本地已經(jīng)有主倉庫,并且子倉庫也在manifest.json文件配置的路徑中,那么在主倉庫中使用mgit命令時,.mgit隱藏文件夾內(nèi)的source-git文件夾內(nèi)不會生成手動下載的子倉庫的.git隱藏文件夾,因?yàn)?code>source-git這個文件夾用來保存著使用mgit命令下載的子倉庫的.git隱藏文件夾。

如果所有子倉庫都在對應(yīng)目錄下,甚至.mgit隱藏文件夾內(nèi)連source-git文件夾都不會自動生成,因?yàn)樗凶觽}庫都不是使用mgit命令自動拉取的。

5.2 新目錄拉取

在一個新目錄或者新設(shè)備上,安裝了mgit之后,可以使用mgit的初始化倉庫命令拉取一套新的多倉庫在本地使用。

# mgit初始化多倉庫命令
$ mgit init -g 主倉庫地址
6、本地配置表 local_manifest 只共同操作特定子倉庫

如果本地只需要操作某幾個子倉庫,其它倉庫不需操作,可以通過創(chuàng)建local_manifest.json臨時修改多倉庫配置,在不修改manifest.json的情況下對配置進(jìn)行調(diào)整,達(dá)到只操作某幾個子倉庫的目的。

將字段mgit-excluded設(shè)置為false,即"mgit-excluded": false

local_manifest的創(chuàng)建和配置方式請查看鏈接中的3.本地配置表local_manifest。
https://github.com/baidu/m-git/blob/master/docs/config/manifest.md

bug 2023-04-08

在實(shí)踐過程中,發(fā)現(xiàn)一個bug
1、使用 mgit init -g xxxxx.git 命令時,生成的本地目錄結(jié)構(gòu)與 manifest.json 中描述的不一致!

2、然后再次使用正確的 mgit 命令(如 mgit status),或者本地本來就有主工程,然后移植到 mgit 管理的話,就會自動拉取子倉庫,這時候本地目錄結(jié)構(gòu)就與 manifest.json 中描述的一致了。

詳見提的 issue:https://github.com/baidu/m-git/issues/14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容