git子模塊簡(jiǎn)介

問(wèn)題背景

隨著公司業(yè)務(wù)線的增加,不同的業(yè)務(wù)線不可避免的有些相似,甚至相同的邏輯,比如營(yíng)銷(xiāo)方略下有營(yíng)銷(xiāo)概覽,數(shù)據(jù)中心下也有一個(gè)同樣的營(yíng)銷(xiāo)概覽模塊,以后可能直投下也會(huì)添加一個(gè)類(lèi)似的模塊。它們的數(shù)據(jù)來(lái)源是相同的,交互也是大同小異。每個(gè)業(yè)務(wù)線都copy一遍代碼,造成了大量的代碼冗余,且后續(xù)修改也要挨個(gè)進(jìn)行一遍,所以這顯然不是一個(gè)好辦法。
本文要介紹的git子模塊,就是解決這個(gè)問(wèn)題的一個(gè)方案,希望能夠拋磚引玉。

git子模塊定義

子模塊允許你將一個(gè)Git倉(cāng)庫(kù)作為另一個(gè)Git倉(cāng)庫(kù)的子目錄。
它能讓你將另一個(gè)倉(cāng)庫(kù)克隆到自己的項(xiàng)目中,同時(shí)還保持提交的獨(dú)立。
子模塊適用于主項(xiàng)目對(duì)子模塊有依賴關(guān)系,卻又并不關(guān)心子模塊的內(nèi)部開(kāi)發(fā)的流程和細(xì)節(jié);適用于整體復(fù)用的情況;
比如我上面描述的問(wèn)題背景,就是典型的案例,營(yíng)銷(xiāo)方略主模塊不關(guān)心營(yíng)銷(xiāo)概覽子模塊的實(shí)現(xiàn),流程只要和數(shù)據(jù)中心保持一致即可;
下面以這個(gè)需求為例,分別簡(jiǎn)單介紹一下submodule和subtree的使用;

已知,子模塊的項(xiàng)目地址是:https://xxx.com/ads-fe/marketing-overview-submodule.git
使用子模塊的主項(xiàng)目是:https://xxx.com/ads-fe/jzt-strategy.git

git submodule

首先介紹一下submodule的使用。

添加子模塊

進(jìn)入主項(xiàng)目所在目錄,添加子模塊到指定目錄下:

 //語(yǔ)法: git submodule add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]  
 git submodule add https://xxx.com/ads-fe/marketing-overview-submodule.git  src/Overview

執(zhí)行完添加后,頁(yè)面會(huì)多出2個(gè)子目錄,如圖所示:


添加

除了這2處外,.git目錄下也有變化,用于記錄子模塊的變更記錄:


gitmodule

協(xié)同開(kāi)發(fā)的問(wèn)題

當(dāng)有協(xié)同人員開(kāi)發(fā)人員同一項(xiàng)目時(shí)需要拉取代碼:

git clone https://xxx.com/ads-fe/jzt-strategy.git
gitclone

注意:此時(shí)目錄是空的,需要執(zhí)行以下代碼:

  git submodule init
  git submodule update

子模塊拉取最新代碼

git submodule update --remote src/Overview 

//更新多個(gè)子模塊
git submodule foreach 'git pull origin master'

刪除子模塊

當(dāng)需求變動(dòng)或者添加錯(cuò)誤的時(shí)候,需要?jiǎng)h除子模塊:

 git submodule deinit  -f  src/Overview

上述命令刪除的只是src/Overviews下的文件,此時(shí),這些文件仍然存在,需要?jiǎng)h除.git/module/src/Overview下的內(nèi)容和修改.gitmodules


rm

git subtree

使用subtree,同樣可以實(shí)現(xiàn)在一個(gè)項(xiàng)目中引用其他項(xiàng)目的數(shù)據(jù);但是和submodule方式不同的是,使用subtree外部的版本庫(kù)會(huì)作為一個(gè)目錄被整個(gè)復(fù)制到本版本庫(kù)中,并且復(fù)制到本版本庫(kù)中的子目錄下的數(shù)據(jù)可以和原版本庫(kù)數(shù)據(jù)建立跟蹤關(guān)聯(lián)。

添加子模塊

使用下面的代碼把子倉(cāng)庫(kù)的地址作為一個(gè)remote,方便記憶;

git remote add  MarketingOverview https://xxx.com/ads-fe/marketing-overview-submodule.git

此時(shí),git config文件會(huì)多出一條記錄:

[remote "MarketingOverview"]
    url = https://xxx.com/ads-fe/marketing-overview-submodule.git
    fetch = +refs/heads/*:refs/remotes/MarketingOverview/*

拉取子模塊代碼
進(jìn)入主項(xiàng)目所在目錄,執(zhí)行:

//語(yǔ)法:git subtree add  --prefix=<prefix> <repository> <ref>
git subtree add --prefix=src/Overview MarketingOverview master –squash

添加之后的src/Overview就是主項(xiàng)目jzt-strategy的一個(gè)普通文件夾,如果這時(shí)候jzt-strategy內(nèi)容更新之后,正常git push即可,子項(xiàng)目對(duì)于主項(xiàng)目來(lái)說(shuō)完全是透明的。

子模塊拉取最新代碼

git subtree pull --prefix=src/Overview MarketingOverview master --squash

刪除子模塊

刪除subtree,直接刪除子模塊所在的目錄即可,沒(méi)有殘留文件需要單獨(dú)清理;

git rm -rf src/Overview/

補(bǔ)充

上面介紹了2種子模塊的增加和刪除功能,但是沒(méi)有介紹修改后的操作,主要是我認(rèn)為這里的使用場(chǎng)景是多業(yè)務(wù)線完整復(fù)用的場(chǎng)景,如果差異過(guò)多,需要自己?jiǎn)为?dú)的模塊,就失去了復(fù)用的意義了。當(dāng)然這并不代表修改功能不能使用,感興趣的小伙伴可以去了解一下,這里就不贅述了。

submodule vs subtree

subtree優(yōu)點(diǎn):

  • subtree相比submodule操作更簡(jiǎn)單;無(wú)論添加還是刪除,都少了很多步驟;
  • 不增加任何像.gitmodule這樣的新的元數(shù)據(jù)文件;
  • git subtree對(duì)于項(xiàng)目中的其他成員透明,意味著可以不知道git subtree的存在

submodule優(yōu)點(diǎn):

  • git submodule在本地可以存在多個(gè)git代碼倉(cāng)庫(kù)
  • git subtree只有一個(gè)代碼庫(kù),也就是說(shuō)在項(xiàng)目?jī)?nèi)部依賴外部獨(dú)立項(xiàng)目的時(shí)候,是完全無(wú)感知的操作。

子模塊存在的問(wèn)題

有些組件,方法或者常量定義,可能另一個(gè)子模塊也在使用,
比如ajax請(qǐng)求,本著盡量少配置和少依賴的原則,子模塊一般會(huì)有自己封裝的ajax方法,因?yàn)榇藭r(shí)不能默認(rèn)主項(xiàng)目也一定有ajax請(qǐng)求,如果引用多個(gè)子模塊,
每個(gè)模塊都有自己的ajax方法,這就造成了一定程度的代碼冗余;

考慮方案:

  • 提取公共組件
  • 常量及公共方法,可以單獨(dú)發(fā)布一個(gè)工具包引入
  • 常量及公共方法再作為一個(gè)子模塊引入

總結(jié)

大家可以根據(jù)實(shí)際情況進(jìn)行選擇使用,如果只是依賴一個(gè)模塊,subtree可能更簡(jiǎn)單一些,如果主項(xiàng)目依賴多個(gè)子項(xiàng)目,submodule才是最好的選擇。

參考:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • 目錄 建立倉(cāng)庫(kù)1.1 創(chuàng)建主倉(cāng)庫(kù)1.2 創(chuàng)建子倉(cāng)庫(kù) 提交內(nèi)容2.1 提交到主工程的倉(cāng)庫(kù)2.2 提交到子模塊的倉(cāng)庫(kù) ...
    SunnyZhou1024閱讀 1,165評(píng)論 1 5
  • 簡(jiǎn)述 在開(kāi)發(fā)中,稍微復(fù)雜一點(diǎn)的項(xiàng)目都會(huì)有多個(gè)功能模塊,大致結(jié)構(gòu)可能是這樣 project |--moduleA |...
    思無(wú)涯1993閱讀 5,810評(píng)論 0 2
  • git子模塊的使用 git子模塊可以用于項(xiàng)目包含另一個(gè)項(xiàng)目的情況,也許是第三方庫(kù)或被多個(gè)項(xiàng)目引用的基礎(chǔ)框架。此次學(xué)...
    看似平淡閱讀 3,052評(píng)論 0 0
  • 在一個(gè)項(xiàng)目中使用另一個(gè)項(xiàng)目,兩個(gè)項(xiàng)目分別有各自的倉(cāng)庫(kù)以及各自的維護(hù)周期 添加外部項(xiàng)目為子模塊 文檔參考 .6 Gi...
    錢(qián)英俊真英俊閱讀 1,380評(píng)論 0 2
  • 添加公共的庫(kù)到當(dāng)前項(xiàng)目中 添加submodule 子模塊添加成功后當(dāng)前項(xiàng)目會(huì)多一個(gè).gitmodules隱藏文件,...
    節(jié)奏l(xiāng)hl閱讀 381評(píng)論 0 0