有種狀況咱們常常會遇到:某個工做中的項目須要包含並使用另外一個項目。 也許是第三方庫,或者你 獨立開發的,用於多個父項目的庫。 如今問題來了:你想要把它們當作兩個獨立的項目,同時又想在 一個項目中使用另外一個。html
Git 經過子模塊來解決這個問題。 子模塊容許你將一個 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」)跟蹤改動。 因此你作的任何改動都不會被跟蹤。post
git checkout stable 進入子模塊並檢出相應的工做分支 git submodule update --remote 從上游拉取數據 git submodule update --remote --merge 從上游拉取數據併合並
若是咱們在主項目中提交併推送但並不推送子模塊上的改動,其餘嘗試檢出咱們修改的人會遇到 麻煩,由於他們沒法獲得依賴的子模塊改動。 那些改動只存在於咱們本地的拷貝中。fetch
爲了確保這不會發生,你可讓 Git 在推送到主項目前檢查全部子模塊是否已推送。 git push 命令接受能夠設置爲 check
或 on-demand
的 --recurse-submodules 參數。 若是任何提交的子模塊改動沒有推送那麼 check
選項會直接使 push 操做失敗。spa
提交主項目時自動檢測子模塊是否有未提交的改動code
git push --recurse-submodules=checkhtm
提交主項目時,嘗試自動推送一改動的子模塊blog
git push --recurse-submodules=on-demand開發
有一個 foreach 子模塊命令,它能在每個子模塊中運行任意命令。 若是項目中包含了大量子模塊,這會很是有用。rem
你可能想爲其中一些命令設置別名,由於它們可能會很是長而你又不能 設置選項做爲它們的默認選項。
例如在有子模塊的項目中切換分支可能會形成麻煩。 若是你建立一個新分支, 在其中添加一個子模塊,以後切換到沒有該子模塊的分支上時,你仍然會有一個還未跟蹤的子模塊目錄。