多倉庫移植 MGit 管理 - 實(shí)操作
MGit
MGit 是一款 Ruby 封裝的基于 Git 的多倉庫管理工具,可以高效的访惜、同時(shí)的對(duì)多個(gè) Git 倉庫執(zhí)行 Git 命令椿疗。 適合于在多個(gè)倉庫中進(jìn)行關(guān)聯(lián)開發(fā)的項(xiàng)目该肴,提高 Git 操作的效率葛假,避免逐個(gè)執(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,暫時(shí)不支持 Windows
- Ruby版本: >= 2.3.7
$ gem install m-git
2酿雪、拉取demo
并體驗(yàn)(初始化多倉庫—)
初始化多倉庫使用 mgit init
命令;
類似于 Git 從遠(yuǎn)程 clone 新倉庫, 會(huì)將多個(gè)倉庫 clone 到本地;
下面通過一個(gè) demo 體驗(yàn)一下 MGit 命令:
2.1 建議在一個(gè)新文件夾中拉取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ī)定的格式放到這個(gè)文件中朋凉。
經(jīng)過實(shí)測(cè),我的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"
}
}
}
簡(jiǎn)單解釋一下注意事項(xiàng):
- 需要注意的是杂彭,為方便管理,需要將主倉庫
MainProject
的abs-dest
路徑吓揪,像文件中這樣設(shè)置為跟 manifest.json 同目錄下"abs-dest": "./"
亲怠。 - 如果主倉庫的 abs-dest 不重新設(shè)置,那么所有倉庫(主倉庫跟所有子倉庫)都將在 “../Developments” 路徑下柠辞。
- 其它子倉庫的
abs-dest
可以不設(shè)置团秽,會(huì)自動(dòng)在“../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治拿、測(cè)試
使用 mgit init -f manifest-path
命令測(cè)試 manifest.json 配置是否正常。
注意manifest-path
就是 manifest.json文件的路徑
笆焰。
注意這個(gè)命令不會(huì)重復(fù)拉取主倉庫劫谅,只會(huì)拉取所有的子倉庫到當(dāng)前目錄,并在當(dāng)前目錄創(chuàng)建一個(gè).mgit
文件夾
你可以在當(dāng)前目錄中看到每個(gè)倉庫的源碼嚷掠,他們的路徑可以通過 manifest.json
的 dest
字段配置捏检。
你也可以在.mgit/source-git/
下看到所有倉庫的.git
, 這是 MGit 對(duì)所有倉庫的托管。
4不皆、提交manifest.json
到遠(yuǎn)端倉庫
本地測(cè)試成功后贯城,你可以提交主倉庫中的 manifest.json,推送主倉庫的變更到遠(yuǎn)端霹娄。
可以連同.mgit
隱藏文件夾一同推送能犯。
5、mgit方式管理
其實(shí)這里有2種使用方式犬耻,一是本地已經(jīng)有主倉庫了直接使用mgit踩晶,二是在新目錄下直接使用mgit拉取并管理。
5.1 直接使用
經(jīng)過第3步的測(cè)試枕磁,在manifest.json
文件同目錄下已經(jīng)自動(dòng)生成了一個(gè).mgit
的隱藏文件夾渡蜻,在這個(gè)同目錄下,就可以使用mgit命令了计济。
當(dāng)使用任何一個(gè)正確的 mgit 命令時(shí)茸苇,它就會(huì)先幫你拉取遠(yuǎn)端倉庫(如果本地路徑不存在的話)。
需要特別注意的是沦寂,如果本地已經(jīng)有主倉庫学密,并且子倉庫也在manifest.json
文件配置的路徑中,那么在主倉庫中使用mgit命令時(shí)凑队,.mgit
隱藏文件夾內(nèi)的source-git
文件夾內(nèi)不會(huì)生成手動(dòng)下載的子倉庫的.git
隱藏文件夾则果,因?yàn)?code>source-git這個(gè)文件夾用來保存著使用mgit命令下載的子倉庫的.git
隱藏文件夾。
如果所有子倉庫都在對(duì)應(yīng)目錄下漩氨,甚至.mgit
隱藏文件夾內(nèi)連source-git
文件夾都不會(huì)自動(dòng)生成西壮,因?yàn)樗凶觽}庫都不是使用mgit命令自動(dòng)拉取的。
5.2 新目錄拉取
在一個(gè)新目錄或者新設(shè)備上叫惊,安裝了mgit之后款青,可以使用mgit的初始化倉庫命令拉取一套新的多倉庫在本地使用。
# mgit初始化多倉庫命令
$ mgit init -g 主倉庫地址
6霍狰、本地配置表 local_manifest 只共同操作特定子倉庫
如果本地只需要操作某幾個(gè)子倉庫抡草,其它倉庫不需操作饰及,可以通過創(chuàng)建local_manifest.json
臨時(shí)修改多倉庫配置,在不修改manifest.json的情況下對(duì)配置進(jìn)行調(diào)整康震,達(dá)到只操作某幾個(gè)子倉庫的目的燎含。
將字段mgit-excluded
設(shè)置為false
,即"mgit-excluded": false
腿短。
local_manifest
的創(chuàng)建和配置方式請(qǐng)查看鏈接中的3.本地配置表local_manifest
屏箍。
https://github.com/baidu/m-git/blob/master/docs/config/manifest.md
bug 2023-04-08
在實(shí)踐過程中,發(fā)現(xiàn)一個(gè)bug
1橘忱、使用 mgit init -g xxxxx.git 命令時(shí)赴魁,生成的本地目錄結(jié)構(gòu)與 manifest.json 中描述的不一致!
2钝诚、然后再次使用正確的 mgit 命令(如 mgit status)颖御,或者本地本來就有主工程,然后移植到 mgit 管理的話凝颇,就會(huì)自動(dòng)拉取子倉庫潘拱,這時(shí)候本地目錄結(jié)構(gòu)就與 manifest.json 中描述的一致了。
詳見提的 issue:https://github.com/baidu/m-git/issues/14