git Submodule 使用時機
大家在開發新專案的時候,不知道有沒有用到其他專案的程式碼,像是 Web 專案,也許會用到 Blueprintcss CSS Framwork 或者是 Sass,這些專案目前都放在 Github 上面進行維護,以前的作法就是先 git clone 下來,把要的檔案分別複製到自己專案,可是問題來了,如果官方更新了程式碼,那自己的專案如何更新呢?難道是重複步驟把檔案複製到原來地方嗎?這樣會不會太麻煩,這時候就是需要 git submodule 來幫助大家進行程式碼的更新,這樣隨時隨地都可以取得最新的程式碼。補充說明一點,git 目前無法針對單一專案底下的單一檔案或目錄進行 clone,而必須 clone 整個目錄,這點跟 svn 有很大的不同,所以 git 可以建立各個不同的 submodule 來整合成一個大型 Project。換句話說就是: 在您的專案底下,你可以任意將其他人的專案掛載在自己任何目錄底下。
建立 Git Submodule
在練習 git 指令之前請先註冊好 github 帳號,並且開一個測試 repository,建立 Submodule 非常容易,語法如下 (more):
實際指令範例:
下這指令之前請注意最後面的 path 部份,請勿先建立空的目錄,也就是如果該目錄存在,就會衝突,所以並不需要額外幫 module 建立目錄,指令完成結果如下:
這時候在目錄底下打入指令 git status,你會發現多了兩個檔案需要 commit:
- # On branch master
- # Changes to be committed:
- # (use "git reset HEAD
..." to unstage) - #
- # new file: .gitmodules
- # new file: user_guide
- #
- [submodule "user_guide"]
- path = user_guide
- url = https://github.com/appleboy/CodeIgniter-TW-Language
接著回去看 github 網站就會多出一個小圖示了:
最後還是需要初始化 init submodule,透過底下指令來達成,否則 git 不知道你有新增 module
clone project with Git Submodule
我們還是拿上面的例子來測試,首先還是一樣用 git clone 來下載程式碼:
可是你有沒有發現 user_guide 這 sub module 是空目錄,這時候就是要透過 git submodule 來下載程式碼:
更新已安裝 module
一樣切換到 sub module 目錄,接著做 git pull:
這時候我們切回去上層目錄,執行 git status:
- # On branch master
- # Changed but not updated:
- # (use "git add
..." to update what will be committed) - # (use "git checkout --
..." to discard changes in working directory) - #
- # modified: user_guide (new commits)
最後可以透過 statu 來看看是否有相同的 commit ID:
移除 Sub module
移除方式非常容易,上面有提到的檔案都必需要經過修改
1. 移除目錄
2. 修改 .gitmodules,移除不需要的 module
3. 修改 .git/config,移除 submodule URL
4. 執行 commit
5. 最後 syn module 資料
總結歸納
git submodule 可以用在跟其他團隊一起合作開發時候,我們只需要知道大的 git,一些細部的 sub module 就可以讓其他團隊在繼續往下開,相當方便。另外也避免每當要更新檔案的時候,還需要重複 clone 加上 cp 資料到對應目錄。 Reference: Git Submodule 的認識與正確使用! , Pro git: git submodule
Supplement
* Git 常見問題 - Git Submodule 指定 Branch
沒有留言:
張貼留言