有種情況我們經常會遇到:某個工作中的項目需要包含并使用另一個項目。 也許是第三方庫,或者你 獨立開發的,用于多個父項目的庫。 現在問題來了:你想要把它們當做兩個獨立的項目,同時又想在 一個項目中使用另一個。
Git 通過子子產品來解決這個問題。 子子產品允許你将一個 Git 倉庫作為另一個 Git 倉庫的子目錄。 它能讓你将另一個倉庫克隆到自己的項目中,同時還保持送出的獨立。
開始使用子子產品
git submodule add remotePath [localPath]
克隆含有子子產品的項目
git clone remotePath
git submodule init # 初始化本地配置檔案
git submodule update # 從該項目中抓取所有資料并檢出父項目中列出的合适的送出。
在包含子子產品的項目上工作
-
進入子子產品目錄中手動抓取與合并
- 進入子子產品目錄
-
git fetch
-
git merger origin/master
- 進入主倉庫目錄
-
直接在主倉庫裡抓取與合并子子產品
-
git submodule update --remote
-
-
在子子產品上工作
當我們運作 git submodule update 從子子產品倉庫中抓取修改時,Git 将會獲得這些改動并 更新子目錄中的檔案,但是會将子倉庫留在一個稱作 “遊離的 HEAD” 的狀态。 這意味着沒有本 地工作分支(例如 “master”)跟蹤改動。 是以你做的任何改動都不會被跟蹤。git checkout stable 進入子子產品并檢出相應的工作分支 git submodule update --remote 從上遊拉取資料 git submodule update --remote --merge 從上遊拉取資料并合并
-
釋出子子產品改動
如果我們在主項目中送出并推送但并不推送子子產品上的改動,其他嘗試檢出我們修改的人會遇到 麻煩,因為他們無法得到依賴的子子產品改動。 那些改動隻存在于我們本地的拷貝中。
為了確定這不會發生,你可以讓 Git 在推送到主項目前檢查所有子子產品是否已推送。 git push 指令接受可以設定為
或check
的 --recurse-submodules 參數。 如果任何送出的子子產品改動沒有推送那麼on-demand
選項會直接使 push 操作失敗。check
-
送出主項目時自動檢測子子產品是否有未送出的改動
git push --recurse-submodules=check
-
送出主項目時,嘗試自動推送一改動的子子產品
git push --recurse-submodules=on-demand
-
子子產品技巧
- 子子產品周遊
有一個 foreach 子子產品指令,它能在每一個子子產品中運作任意指令。 如果項目中包含了大量子子產品,這會非常有用。
- 有用的别名
你可能想為其中一些指令設定别名,因為它們可能會非常長而你又不能 設定選項作為它們的預設選項。
子子產品的問題
例如在有子子產品的項目中切換分支可能會造成麻煩。 如果你建立一個新分支, 在其中添加一個子子產品,之後切換到沒有該子子產品的分支上時,你仍然會有一個還未跟蹤的子子產品目錄。
識微見遠 格物緻知