目的:
隨著倉庫使用的越來越久琴拧,倉庫中的子目錄越來越多蝌借,倉庫也變得越來越大。會導(dǎo)致pull和push的時(shí)間變長吟吝,共享代碼就會變得很痛苦菱父。
可以用將子目錄獨(dú)立成一個(gè)submodule的方式,保留分支和提交歷史剑逃。
步驟:
1. Clone倉庫到本地目錄
$ git clone http://gitlab.xxx/xxx.git
倉庫結(jié)構(gòu):
myrepo
?--test1
--src
--...
我想要把test1這個(gè)子目錄submodule化
2. 選擇要保留的分支
通常剛clone下來的倉庫本地只會有一個(gè)branch:master浙宜,如果我們希望在馬上要做的子模塊中保存其他的分支,那就首先把它們創(chuàng)建出來:
$ git checkout release
$ git checkout fix
3. 刪除remote信息
$ git remote rm origin
4. 轉(zhuǎn)化成submodule
這是最重要的一步
$ git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter test1 -- --all
該命令過濾所有歷史提交蛹磺,保留對test1子目錄有影響的提交粟瞬,并且把子目錄設(shè)為該倉庫的根目錄。下面解釋下各參數(shù)意思:
--tag-name-filter cat 該參數(shù)控制我們要如何保存舊的tag萤捆,參數(shù)值為bash命令裙品,cat表示原樣輸出俗批。所以,如果你不關(guān)心tag市怎,就不需要這個(gè)參數(shù)了岁忘;
--prune-empty 刪除空的(對子目錄沒有影響的)的提交
--subdirectory-filter test1指定子模塊路徑
-- --all 該參數(shù)必須跟在--后面,表示對所有分支做操作区匠,即對上一步創(chuàng)建的所有本地分支做操作臭觉。所以,如果你只想保存當(dāng)前分支辱志,就不需要這個(gè)參數(shù)了
該命令執(zhí)行完畢后蝠筑,查看當(dāng)前目錄結(jié)構(gòu)就會發(fā)現(xiàn)里面已經(jīng)是子目錄的內(nèi)容了。git log查看提交歷史已經(jīng)正常保存了揩懒。
清理:
上面的步驟完成后什乙,當(dāng)前倉庫里還保存了很多不需要的object, 需要做下清理,才能減少當(dāng)前倉庫的體積已球。
$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
$ git reflog expire --expire=now --all
$?git gc --aggressive --prune=now
提交:
1. 首先要在gitlab上創(chuàng)建test1的倉庫
2. 對應(yīng)remote
$ git remote add origin http://xxxx/test1.git
3. 提交
$ git push -u origin --all
$ git push -u origin --tags
添加submodule
1. 再clone一份原來的倉庫
2. 刪除子目錄test1
3. 把test1以submodule的方式添加
$ git submodule add -b master http://gitlabxxxx/test1.git test1
4. 提交修改