git submodule 實用教程

在這篇文章中脑豹,我們來講解一下 git submodule的實戰(zhàn)用法,包括:

  1. 注冊 git 子模塊
  2. 從已有的文件創(chuàng)建 git 子模塊
  3. 向上同步主倉庫
  4. 向下同步子模塊倉庫
  5. 疑難雜癥

注冊 git子模塊

假設(shè)我們有主倉庫main-module.git钥勋,遠程地址 https://github.com/bitmingw/main-module.git,目錄結(jié)構(gòu)

.
└── main.txt

以及倉庫 sub-module.git,遠程地址 https://github.com/bitmingw/sub-module.git法瑟,目錄結(jié)構(gòu)

.
└── sub.txt

如果想要將倉庫sub-module.git注冊成為主倉庫main-module.git的一個子模塊秽浇,可以使用如下指令:

main-module/
git submodule add https://github.com/bitmingw/sub-module.git
git commit -m "add submodule version 1.0"

git會自動從遠程服務(wù)器 clone sub-module.git浮庐,之后 main-module.git的目錄會變成這個樣子

.
├── main.txt
└── sub-module
└── sub.txt

由于添加git 子模塊的操作本身也是一個提交,因此它僅僅對main-module.git的當(dāng)前分支有效柬焕,另外的分支不會感知到這一變化审残。

從已有的文件創(chuàng)建 git 子模塊

大多數(shù)時候,git 子模塊不是憑空創(chuàng)建的斑举,而是從項目中已有的文件拆分出來的搅轿。從已有的文件創(chuàng)建git 子模塊需要做三件事:首先為拆分出來的文件創(chuàng)建新的 git 倉庫,然后從主倉庫中將獨立出去的文件移除富玷,最后再注冊git 子模塊

例如璧坟,假設(shè)main-module.git的目錄結(jié)構(gòu)如下所示

.
├── main.txt
└── sub-module
└── sub.txt

它有v1.0v2.0 兩個分支,在 v2.0分支中赎懦,我們想讓 sub-module文件夾變成sub-module.git子模塊雀鹃。

\color{#df00d0}{第一步} ,為sub-module創(chuàng)建一個單獨的 git倉庫:

git checkout v2.0
cd sub-module
git init
git add sub.txt
git commit -m "version 1.0 of sub-module"
git remote add origin https://github.com/bitmingw/sub-module.git
git push -u origin master

\color{#df00d0}{第二步}励两,從 main-module.git中刪除 sub-module文件夾:

cd .. # main-module/
git rm -r sub-module
git commit -m "remove sub-module directory"

\color{#df00d0}{第三步}黎茎,將 sub-module.git注冊為main-module.git的子模塊

main-module/
git submodule add https://github.com/bitmingw/sub-module.git
git commit -m "add submodule version 1.0"

向下同步子模塊倉庫

如果你是主倉庫的開發(fā)者,你可能不想使用最新版本的子模塊当悔,而是使用主倉庫中指定版本的子模塊傅瞻,此時可以使用下面的指令:

git submodule update

在使用該指令前,主倉庫和子模塊的git status分別是:

~/main-module$ git status
On branch v2.0
Your branch is up-to-date with 'origin/v2.0'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   sub-module (new commits)

no changes added to commit (use "git add" and/or "git commit -a")

========

~/main-module/sub-module$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

使用了git submodule update 之后盲憎,兩個倉庫的 git status信息變成了這個樣子:

~/main-module$ git status
On branch v2.0
Your branch is up-to-date with 'origin/v2.0'.
nothing to commit, working directory clean

========

~/main-module/sub-module$ git status
HEAD detached at 359bce6
nothing to commit, working directory clean

這樣嗅骄,主倉庫的開發(fā)者就可以從一個干凈的空間開始工作了。

疑難雜癥

還記得我們是從v2.0 分支引入子模塊的么焙畔?假如現(xiàn)在要查看v1.0分支掸读,會發(fā)生什么呢?

還記得我們是從 v2.0 分支引入子模塊的么?假如現(xiàn)在要查看 v1.0 分支儿惫,會發(fā)生什么呢澡罚?

~/main-module$ git checkout v1.0
error: The following untracked working tree files would be overwritten by checkout:
        sub-module/sub.txt
Please move or remove them before you can switch branches.
Aborting

難道有了子模塊之后我們就回不去了?肾请?情況沒有那么糟糕留搔,我們可以通過 git checkout -f v1.0強行回去。


~/main-module$ git checkout -f v1.0
warning: unable to rmdir sub-module: Directory not empty
Switched to branch 'v1.0'
Your branch is up-to-date with 'origin/v1.0'.

不過這個時候要注意铛铁,由于sub-module沒有被移除隔显,因此切換到 v1.0 分支以后,你看到的sub-module文件夾依然是個子模塊饵逐。也就是說括眠,子模塊穿越了時空來到了v1.0 分支…… 嗯這個行為似乎不是我們期望的那個樣子。

如果你真的想回到v1.0 分支的非子模塊的 sub-module倍权,那你不得不在切換分支前把這個子模塊卸載掉:

git rm -r sub-module
git commit -m "remove submodule" 
git checkout v1.0

如果你想從v1.0 分支回到v2.0掷豺,也會遇到一些問題。

~/main-module$ git checkout v2.0
M       sub-module
Switched to branch 'v2.0'
Your branch is up-to-date with 'origin/v2.0'.

~/main-module$ git status
On branch v2.0
Your branch is up-to-date with 'origin/v2.0'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)

        modified:   sub-module (modified content)

no changes added to commit (use "git add" and/or "git commit -a")

經(jīng)過了git checkout -f v1.0git checkout v2.0之后薄声,子模塊的文件竟然被 git刪掉了挺据。而且這個時候無論是 git submodule update還是 git checkout -- sub-module都不好使了搁拙。到底應(yīng)該怎么辦呢?

答案是在子模塊內(nèi)部使用 git reset

~/main-module/sub-module$ git reset --hard HEAD
HEAD is now at 359bce6 version 1.0 of sub-module

~/main-module/sub-module$ git status
HEAD detached at 359bce6
nothing to commit, working directory clean

從這一部分的演示可以看出悔据,git submodule的設(shè)計對從已有文件拆分出來的子模塊來說是非常糟糕的窿凤∏Ч幔或許這會成為大家盡量避免使用git 子模塊的原因之一吧孕似。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桌粉,隨后出現(xiàn)的幾起案子蒸绩,更是在濱河造成了極大的恐慌,老刑警劉巖铃肯,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件患亿,死亡現(xiàn)場離奇詭異,居然都是意外死亡押逼,警方通過查閱死者的電腦和手機步藕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挑格,“玉大人咙冗,你說我怎么就攤上這事∑” “怎么了雾消?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵灾搏,是天一觀的道長。 經(jīng)常有香客問我立润,道長狂窑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任桑腮,我火速辦了婚禮泉哈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘破讨。我一直安慰自己丛晦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布提陶。 她就那樣靜靜地躺著烫沙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隙笆。 梳的紋絲不亂的頭發(fā)上斧吐,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機與錄音仲器,去河邊找鬼。 笑死仰冠,一個胖子當(dāng)著我的面吹牛乏冀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洋只,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辆沦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了识虚?” 一聲冷哼從身側(cè)響起肢扯,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担锤,沒想到半個月后蔚晨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肛循,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年铭腕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多糠。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡累舷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夹孔,到底是詐尸還是另有隱情被盈,我是刑警寧澤析孽,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站只怎,受9級特大地震影響袜瞬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尝盼,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一吞滞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盾沫,春花似錦裁赠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蕾哟,卻和暖如春一忱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谭确。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工帘营, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逐哈。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓芬迄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昂秃。 傳聞我的和親對象是個殘疾皇子禀梳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

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

  • 創(chuàng)建版本庫 git init 首次提交 git add 1.txt 2.txt git commit -m "fi...
    十六郎閱讀 155評論 0 0
  • 面對比較復(fù)雜的項目,我們有可能會將代碼根據(jù)功能拆解成不同的子模塊肠骆。主項目對子模塊有依賴關(guān)系算途,卻又并不關(guān)心子模塊的內(nèi)...
    前端輝羽閱讀 1,929評論 0 2
  • 最近在項目中使用了 Git Submodule 的功能,好處是如果是自己開發(fā)的封裝庫蚀腿,比較方便調(diào)試嘴瓤,push 時可...
    Kaaaaai閱讀 7,230評論 1 1
  • 用到的組件 1、通過CocoaPods安裝 2莉钙、第三方類庫安裝 3纱注、第三方服務(wù) 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,609評論 1 180
  • 久違的晴天,家長會胆胰。 家長大會開好到教室時狞贱,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗蜀涨。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,515評論 16 22