about 9 years ago

在多個專案裡, 常常會出現相同的需求/功能, 最前見的做法就是install Package(npm, yum, composer...),
但有時候這樣的Library可能正在共同開發or與專案相依性很高, 需要跨git的repository共同編輯.

通常這時候會發現一個解決方案Submodule,
它的運作模式跟package很像, 會把sub的目錄給ignore,
當有人git clone repository後,
就需要執行git submodule init/update將sub的repository給抓下來,
否則程式是無法正常運作的,
subodule將repository和sub repository做很完整的切個,
如此一來, 有無知者在主repository修改sub repository的code,
未正確的commit到sub repository.
茶几上就會充滿著悲劇!!!

現在要與大家分享一個更棒的解決方案git subtree,
讓你的repository像樹一樣成長吧!!

在以下每一次subtree的操作,
都需要處於已commit的狀態(git status 會出現 nothing to commit).

subtree有個缺點,
就是cli的指令有點長,
因此第一步建議要將repository的url先設定好短代碼.

git remote add subsdk git@github.com:yutin1987/subsdk.git

將repository已存在的目錄切個成另外一個repository

隨著時間開發, 決定要切割成另一個repository作為library共用,
可以使用 split,

git subtree split --prefix app/library/SubSDK

把app/library/SubSDK目錄做切割,
接著將app/library/SubSDK, push到另一個repository並指定branch為master.

git subtree push --prefix app/library/SubSDK subsdk master

簡單兩行指令, 就已經成功的將subsdk切割到另一個repository.

把其他的repository, 引入到需要的repository內

某個repository, 剛好正需要使用subsdk,
並想要把subsdk也放到app/library/SubSDK目錄內,
只需要執行下行指令, 就可以把master放入到指定的目錄內.

git subtree add --prefix app/library/SubSDK subsdk master

維護sub repository

在coding的過程中, 只需要按照平常的習慣commit/sync,
當有修改到sub repository內的code時,
只需要在整個repository commit過後,
執行git subtree push --prefix app/library/SubSDK subsdk master
就可以更新遠端sub repository,
當其他的repository需要更新sub repository時,
可以執行git subtree pull --prefix app/library/SubSDK
完成本地端的更新.

git clone

當repository被clone下來後, 並不需要執行任何指令,
就可以正常運作,
因為在repository commit的同時,
會把sub repository也一起commit,
並不會ignore.

← [Other] Re: Re: 業界與學界,深刻的鴻溝 [PHP] PHP_CodeSniffer @Sublime Text →