如何在Github上使用Git subtree來管理父子專案

貝克蛤蟆發表於2017-06-07

背景

對於經常玩Github的肯定注意到了某些開源專案會與主專案與釋出專案之分,比如YII-dev主專案與釋出專案YII,主專案包含了框架程式碼,測試文件,說明文件,整個專案達到上百M,如果把整合專案都讓開發者down下來肯定很不人性化,對於國內使用者肯定要哭了.YII考慮到這個問題,因此構建了釋出專案,只包含核心原始碼,這樣容量就小多了,是不是感覺到YII很貼心.同時兩個專案還保留同樣的commit history,整體看起來好舒服.那麼我們如何實現類似的git工作流呢?

實踐

首先來看比較經典的git專案目錄
project
–build
–doc
–src,
–tests
這樣類似的目錄,這就是我們的主專案.而經常會把src做為子專案,獨立為新的git專案.
下面來講在已經有主專案的情況下如何構建子專案,來我們一步步來實踐.

我們發現相關的git核心命令是subtree,先了解一下文件git-subtree
通過文件上的內容,我們很容易得出這樣的實現步驟:

1.初始化子專案

cd project
//新增源,你已經在github上建立了子專案倉庫.
git remote add srcProject https://github.com/xxxx/子專案.git

2.直接提交子專案

git subtree push -P src srcProject master

一切順利的話,git就已經在完成命令了,然後上github上src上的程式碼已經進入子專案倉庫中,是不是so easy.然而這麼快就結束了嗎?多試幾次,你會發現每次push命令都會遍歷全部的commit,當你的專案越來越大,commit的數上來的時候,等待時間就會很長.我們再看看進階的命令.

3.使用split

git subtree split --rejoin --prefix=src --branch srcTemp
git push srcProject srcTemp:master

–rejoin 避免了遍歷全部commit的問題.

再多一點

實踐中,專案經常是一個團隊協作的多人開發,可以這麼來分角色,開發組可以只引用主專案.專案釋出者來負責子專案的更新與釋出.
1.為主專案獨立建立倉庫目錄.注:發現使用git desktop時,使用subtree命令也會出現在commit項中,為了避免主專案commit中出現多餘的項,建議不要與開發目錄相同.
2.當需要釋出的時候,pull主專案原始碼,然後按照subtree的命令進行釋出.
3.使用github來發布版本.

相關文章