git submodule 實(shí)踐及總結(jié)

合作開(kāi)發(fā),不得不使用git來(lái)進(jìn)行項(xiàng)目管理峦筒,下面來(lái)記錄下關(guān)于git的踩坑記錄。

子模塊概念

對(duì)于一些比較大的工程窗慎,為了便模塊復(fù)用物喷,常常需要抽取子項(xiàng)目卤材,分布式管理項(xiàng)目依賴(lài),會(huì)用到子模塊(git submodule)峦失。

子模塊跟父工程之間是兩個(gè)獨(dú)立的git倉(cāng)庫(kù)扇丛,只是父工程存儲(chǔ)了它依賴(lài)的子倉(cāng)庫(kù)的版本號(hào)信息而已,信息提交相互獨(dú)立尉辑。

子模塊創(chuàng)建

子模塊添加

# 在主工程倉(cāng)庫(kù)中添加子依賴(lài)子模塊
$ git submodule add <遠(yuǎn)程子模塊倉(cāng)庫(kù)地址> <相對(duì)于項(xiàng)目的本地路徑>

下面模擬添加帆精,執(zhí)行完添加之后會(huì)返現(xiàn)本地多了一個(gè).gitmodules隱藏文件。

$ git submodule add https://github.com/xxx/module.git module
$ cat .gitmodules
[submodule "module"]
    path = module
    url = https://github.com/xxx/module.git

設(shè)置子模塊依賴(lài)分支

$ git submodule set-branch (--branch|-b <branch>) [--] <path>

# 例如設(shè)置 module 子模塊依賴(lài)分支為 develop
$ git submodule set-branch -b develop module

$ cat .gitmodules
[submodule "module"]
    path = module
    url = https://github.com/xxx/module.git
    branch = develop

查看.gitmodules文件發(fā)現(xiàn)其指定了一個(gè)依賴(lài)的子模塊隧魄,path指明在主倉(cāng)庫(kù)的位置卓练,url指明子模塊倉(cāng)庫(kù)的遠(yuǎn)程地址。
并且在主工程倉(cāng)庫(kù)的.git/config配置文件中加入了submodule字段

[submodule "module"]
    url = https://github.com/xxx/module.git
    active = true

clone帶有子模塊的倉(cāng)庫(kù)

在主工程倉(cāng)庫(kù)添加完子模塊并push到遠(yuǎn)端之后堤器,同事需要clone或者pull主工程倉(cāng)庫(kù)之后昆庇,會(huì)發(fā)現(xiàn)子模塊依賴(lài)信息(有.gitmodules文件),但是子模塊文件目錄下面是空的闸溃,這個(gè)時(shí)候需要手動(dòng)對(duì)子模塊信息初始化并更新整吆。

$ git submodule init

# 執(zhí)行結(jié)果
Submodule 'module' (https://github.com/xxxx/module.git) registered for path 'module'

補(bǔ)充:當(dāng)有該倉(cāng)庫(kù)下依賴(lài)了多個(gè)子模塊,但是只想初始化指定的子模塊辉川,可以在指令后面追加需要初始化模塊path

$ git submodule init [<path>…]
# 例如 git submodule init demo1 demo2

這時(shí).git/config配置文件中會(huì)包含有依賴(lài)的子模塊信息表蝙,再執(zhí)行更新,從遠(yuǎn)程拉取依賴(lài)的commit id子模塊代碼

git submodule update

# 執(zhí)行結(jié)果
Cloning into '/.../MainProject/module'...
Submodule path 'module': checked out 'submodule commit id'

當(dāng)多層依賴(lài)子模塊時(shí)(子模塊里面依賴(lài)有子模塊)乓旗,這個(gè)時(shí)候就比較麻煩了府蛇,每次clone下來(lái)之后首先要在第一層依賴(lài)的子模塊的倉(cāng)庫(kù)對(duì)子模塊進(jìn)行initupdate,之后再進(jìn)入依賴(lài)有子模塊的子模塊倉(cāng)庫(kù)再進(jìn)行initupdate屿愚,以此遞歸下去汇跨,比較麻煩,此時(shí)可以使用下面指令一次性完成遞歸initupdate

$ git submodule update --init --recursive

也或者直接在clone的時(shí)候完成多層依賴(lài)的子模塊們的initupdate

$ git clone --recurse-submodules <遠(yuǎn)程主工程倉(cāng)庫(kù)地址>

這樣便省去了手動(dòng)遞歸執(zhí)行$ git submodule init$ git submodule update

注意:不管是使用系統(tǒng)的遞歸克隆還是手動(dòng)遞歸執(zhí)行的初始化和更新妆距,此時(shí)子模塊的HEAD都有可能處于游離狀態(tài)穷遂,需要手動(dòng)切換到對(duì)應(yīng)的分支

子模塊信息更改

主工程都記錄有依賴(lài)的子工程的提交版本,查看主工程依賴(lài)的commit id

$ git submodule status

# 結(jié)果
414b65085b41f4270322716df924625fdbcedf7b module (heads/master)

我們可以cd到子工程倉(cāng)庫(kù)目錄下面娱据,對(duì)子工模塊代碼做一些修改蚪黑,在commit之前主倉(cāng)庫(kù)status會(huì)顯示module modified content,顯示子模塊原先提交版本上有臟數(shù)據(jù)中剩;在commit之后主倉(cāng)庫(kù)的status會(huì)顯示module new commits忌穿,依賴(lài)的子模塊的提交版本號(hào)發(fā)生變化,在子模塊倉(cāng)庫(kù)代碼提交并更新到遠(yuǎn)端之后结啼,便可以提交更新依賴(lài)的子模塊的提交版本號(hào)掠剑。

注意:主工程的提交及更新并不會(huì)對(duì)子模塊代碼造成影響,只會(huì)影響其依賴(lài)的子模塊提交版本

如果同事更新了子模塊代碼郊愧,然后更新了父項(xiàng)目中依賴(lài)的版本號(hào)朴译。你在主倉(cāng)庫(kù)執(zhí)行git pull之后會(huì)發(fā)現(xiàn)子模塊文件有變更沸伏,執(zhí)行git diff會(huì)發(fā)現(xiàn)如下更改

$ git diff
-Subproject commit f88b46fefb73438e2e65c2b7bc7baba8a64ae5d2 #同事新提交的子模塊版本
+Subproject commit c577a495c14159b3693c54af2a0bb9760d748246 #我們?cè)瓉?lái)依賴(lài)的子模塊的老版本

這時(shí)我們?nèi)绻麑?duì)父工程倉(cāng)庫(kù)代碼直接進(jìn)行提交,便會(huì)更改父?jìng)}庫(kù)依賴(lài)的子模塊版本號(hào)动分,別人更新下來(lái)的父?jìng)}庫(kù)還是依賴(lài)?yán)系淖幽K提交版本毅糟。雖然后期可以通過(guò)更新依賴(lài)版本更正過(guò)來(lái),但是也會(huì)給平時(shí)的合作開(kāi)發(fā)帶來(lái)不必要的麻煩澜公,因此每次對(duì)主倉(cāng)庫(kù)進(jìn)行git pull之后姆另,還要執(zhí)行git submodule update對(duì)依賴(lài)的子模塊代碼進(jìn)行一次更新。
但是如果子模塊里面還依賴(lài)有子模塊坟乾,我們就需要cd到對(duì)應(yīng)的目錄下面迹辐,一層層調(diào)用子模塊更新,此時(shí)為了方便甚侣,我們可以用git submodule update --recursive指令完成多層子模塊代碼的更新明吩。

子模塊刪除

刪除一共分為3步
1、從.git/config中刪除子模塊條目

$ git submodule deinit -f <path>

# 例如:想刪除名字叫 module 的子模塊
$ git submodule deinit -f module

2殷费、從.git/modules目錄中刪除子模塊目錄

$ rm -rf .git/modules/<path>

# 例如:想刪除名字叫 module 的子模塊
$ rm -rf .git/modules/module

3印荔、刪除.gitmodules中子模塊條目,并刪除項(xiàng)目目錄下的子模塊目錄

$ git rm -f <path>

# 例如:想刪除名字叫 module 的子模塊
$ git rm -f module
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末详羡,一起剝皮案震驚了整個(gè)濱河市仍律,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌实柠,老刑警劉巖水泉,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異窒盐,居然都是意外死亡草则,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)蟹漓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炕横,“玉大人,你說(shuō)我怎么就攤上這事牧牢】达保” “怎么了姿锭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵塔鳍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我呻此,道長(zhǎng)轮纫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任焚鲜,我火速辦了婚禮掌唾,結(jié)果婚禮上放前,老公的妹妹穿的比我還像新娘。我一直安慰自己糯彬,他們只是感情好凭语,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著撩扒,像睡著了一般似扔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搓谆,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天炒辉,我揣著相機(jī)與錄音,去河邊找鬼泉手。 笑死黔寇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斩萌。 我是一名探鬼主播缝裤,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颊郎!你這毒婦竟也來(lái)了呼渣?” 一聲冷哼從身側(cè)響起午衰,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桐款,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桥爽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年舌胶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片答倡。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轰传,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘪撇,到底是詐尸還是另有隱情获茬,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布倔既,位于F島的核電站恕曲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏渤涌。R本人自食惡果不足惜佩谣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望实蓬。 院中可真熱鬧茸俭,春花似錦吊履、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至腾窝,卻和暖如春冕臭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燕锥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工辜贵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人归形。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓托慨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親暇榴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厚棵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 開(kāi)發(fā)中我們經(jīng)常會(huì)遇到這樣的情況:項(xiàng)目越來(lái)越大,一些通用的模塊我們希望將他抽離出來(lái)作為單獨(dú)的項(xiàng)目蔼紧,以便其他項(xiàng)目也可以...
    feil0n9wan9閱讀 19,925評(píng)論 0 24
  • 獲取與創(chuàng)建項(xiàng)目 創(chuàng)建倉(cāng)庫(kù)的途徑有:在本地已有的目錄婆硬,初始化一個(gè)新的;克隆復(fù)制一份別人的項(xiàng)目奸例。 git init 在...
    daking閱讀 6,569評(píng)論 3 48
  • git常用命令 注意:請(qǐng)確保已經(jīng)安裝里git客戶(hù)端 git使用幫助 git --help //git使用幫助查吊,可...
    憤怒的五百萬(wàn)閱讀 6,806評(píng)論 0 2
  • 1. 安裝 git 不同系統(tǒng)下 git 的安裝 Mac上可以在終端上輸入: git --version 來(lái)查看gi...
    學(xué)生陳希閱讀 1,646評(píng)論 0 4
  • 在當(dāng)年好友無(wú)幾的北京里谐区,第一次感到無(wú)助和孤獨(dú),那感覺(jué)正如張愛(ài)玲說(shuō)的:“笑逻卖,全世界與你同聲笑宋列;哭,你便獨(dú)自哭评也×墩龋” 然...
    南風(fēng)也溫柔閱讀 178評(píng)論 0 8