Git Submodule管理項(xiàng)目子模塊

使用場(chǎng)景

當(dāng)項(xiàng)目越來越龐大之后,不可避免的要拆分成多個(gè)子模塊诉儒,我們希望各個(gè)子模塊有獨(dú)立的版本管理辐烂,并且由專門的人去維護(hù),這時(shí)候我們就要用到git的submodule功能验残。

常用命令

git clone <repository> --recursive 遞歸的方式克隆整個(gè)項(xiàng)目
git submodule add <repository> <path> 添加子模塊
git submodule init 初始化子模塊
git submodule update 更新子模塊
git submodule foreach git pull 拉取所有子模塊

如何使用

  1. 創(chuàng)建帶子模塊的版本庫
    例如我們要?jiǎng)?chuàng)建如下結(jié)構(gòu)的項(xiàng)目
project
  |--moduleA
  |--readme.txt

創(chuàng)建project版本庫捞附,并提交readme.txt文件

git init --bare project.git
git clone project.git project1
cd project1
echo "This is a project." > readme.txt
git add .
git commit -m "add readme.txt"
git push origin master
cd ..

創(chuàng)建moduleA版本庫,并提交a.txt文件

git init --bare moduleA.git
git clone moduleA.git moduleA1
cd moduleA1
echo "This is a submodule." > a.txt
git add .
git commit -m "add a.txt"
git push origin master
cd ..

在project項(xiàng)目中引入子模塊moduleA您没,并提交子模塊信息

cd project1
git submodule add ../moduleA.git moduleA
git status
git diff
git add .
git commit -m "add submodule"
git push origin master
cd ..

使用git status可以看到多了兩個(gè)需要提交的文件鸟召,其中.gitmodules指定submodule的主要信息,包括子模塊的路徑和地址信息氨鹏,moduleA指定了子模塊的commit id欧募,使用git diff可以看到這兩項(xiàng)的內(nèi)容。這里需要指出父項(xiàng)目的git并不會(huì)記錄submodule的文件變動(dòng)仆抵,它是按照commit id指定submodule的git header跟继,所以.gitmodules和moduleA這兩項(xiàng)是需要提交到父項(xiàng)目的遠(yuǎn)程倉(cāng)庫的。

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
    new file:   .gitmodules
    new file:   moduleA
  1. 克隆帶子模塊的版本庫
    方法一镣丑,先clone父項(xiàng)目舔糖,再初始化submodule,最后更新submodule莺匠,初始化只需要做一次金吗,之后每次只需要直接update就可以了,需要注意submodule默認(rèn)是不在任何分支上的,它指向父項(xiàng)目存儲(chǔ)的submodule commit id辽聊。
git clone project.git project2
cd project2
git submodule init
git submodule update
cd ..

方法二纪挎,采用遞歸參數(shù)--recursive,需要注意同樣submodule默認(rèn)是不在任何分支上的跟匆,它指向父項(xiàng)目存儲(chǔ)的submodule commit id异袄。

git clone project.git project3 --recursive
  1. 修改子模塊
    修改子模塊之后只對(duì)子模塊的版本庫產(chǎn)生影響,對(duì)父項(xiàng)目的版本庫不會(huì)產(chǎn)生任何影響玛臂,如果父項(xiàng)目需要用到最新的子模塊代碼烤蜕,我們需要更新父項(xiàng)目中submodule commit id,默認(rèn)的我們使用git status就可以看到父項(xiàng)目中submodule commit id已經(jīng)改變了迹冤,我們只需要再次提交就可以了讽营。
cd project1/moduleA
git branch
echo "This is a submodule." > b.txt
git add .
git commit -m "add b.txt"
git push origin master
cd ..
git status
git diff
git add .
git commit -m "update submodule add b.txt"
git push origin master
cd ..
  1. 更新子模塊

更新子模塊的時(shí)候要注意子模塊的分支默認(rèn)不是master。

方法一泡徙,先pull父項(xiàng)目橱鹏,然后執(zhí)行g(shù)it submodule update,注意moduleA的分支始終不是master堪藐。

cd project2
git pull
git submodule update
cd ..

方法二莉兰,先進(jìn)入子模塊,然后切換到需要的分支礁竞,這里是master分支糖荒,然后對(duì)子模塊pull,這種方法會(huì)改變子模塊的分支模捂。

cd project3/moduleA
git checkout master
cd ..
git submodule foreach git pull
cd ..
  1. 刪除子模塊

網(wǎng)上有好多用的是下面這種方法

git rm --cached moduleA
rm -rf moduleA
rm .gitmodules
vim .git/config

刪除submodule相關(guān)的內(nèi)容捶朵,例如下面的內(nèi)容

[submodule "moduleA"]
      url = /Users/nick/dev/nick-doc/testGitSubmodule/moduleA.git

然后提交到遠(yuǎn)程服務(wù)器

git add .
git commit -m "remove submodule"

但是我自己本地實(shí)驗(yàn)的時(shí)候,發(fā)現(xiàn)用下面的方式也可以狂男,服務(wù)器記錄的是.gitmodules和moduleA综看,本地只要用git的刪除命令刪除moduleA,再用git status查看狀態(tài)就會(huì)發(fā)現(xiàn).gitmodules和moduleA這兩項(xiàng)都已經(jīng)改變了并淋,至于.git/config寓搬,仍會(huì)記錄submodule信息,但是本地使用也沒發(fā)現(xiàn)有什么影響县耽,如果重新從服務(wù)器克隆則.git/config中不會(huì)有submodule信息句喷。

git rm moduleA
git status
git commit -m "remove submodule"
git push origin master
?著作權(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)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祭饭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門芜茵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倡蝙,你說我怎么就攤上這事九串。” “怎么了寺鸥?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵猪钮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我胆建,道長(zhǎng)烤低,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任笆载,我火速辦了婚禮扑馁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凉驻。我一直安慰自己檐蚜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布沿侈。 她就那樣靜靜地躺著,像睡著了一般市栗。 火紅的嫁衣襯著肌膚如雪缀拭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天填帽,我揣著相機(jī)與錄音蛛淋,去河邊找鬼。 笑死篡腌,一個(gè)胖子當(dāng)著我的面吹牛褐荷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘹悼,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼叛甫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了杨伙?” 一聲冷哼從身側(cè)響起其监,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎限匣,沒想到半個(gè)月后抖苦,有當(dāng)?shù)厝嗽跇淞掷锇l(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
  • 文/蒙蒙 一藐翎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧实幕,春花似錦吝镣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至整吆,卻和暖如春拱撵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背表蝙。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工拴测, 沒想到剛下飛機(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)容