Git 子模塊 - submodule(轉)

原文地址: http://www.cnblogs.com/kelsen/p/5918672.html

有種狀況咱們常常會遇到:某個工做中的項目須要包含並使用另外一個項目。 也許是第三方庫,或者你 獨立開發的,用於多個父項目的庫。 如今問題來了:你想要把它們當作兩個獨立的項目,同時又想在 一個項目中使用另外一個。html

Git 經過子模塊來解決這個問題。 子模塊容許你將一個 Git 倉庫做爲另外一個 Git 倉庫的子目錄。 它能讓你將另外一個倉庫克隆到本身的項目中,同時還保持提交的獨立。git

開始使用子模塊

git submodule add remotePath [localPath]

克隆含有子模塊的項目

git clone remotePath
git submodule init        # 初始化本地配置文件
git submodule update    # 從該項目中抓取全部數據並檢出父項目中列出的合適的提交。

在包含子模塊的項目上工做

  1. 進入子模塊目錄中手動抓取與合併

    • 進入子模塊目錄
    • git fetch
    • git merger origin/master
    • 進入主倉庫目錄
  2. 直接在主倉庫裏抓取與合併子模塊

    • git submodule update --remote
  3. 在子模塊上工做

    當咱們運行 git submodule update 從子模塊倉庫中抓取修改時,Git 將會得到這些改動並 更新子目錄中的文件,可是會將子倉庫留在一個稱做 「遊離的 HEAD」 的狀態。 這意味着沒有本 地工做分支(例如 「master」)跟蹤改動。 因此你作的任何改動都不會被跟蹤。post

     git checkout stable                        進入子模塊並檢出相應的工做分支
     git submodule update --remote            從上游拉取數據
     git submodule update --remote --merge     從上游拉取數據併合並
    
  4. 發佈子模塊改動

    若是咱們在主項目中提交併推送但並不推送子模塊上的改動,其餘嘗試檢出咱們修改的人會遇到 麻煩,由於他們沒法獲得依賴的子模塊改動。 那些改動只存在於咱們本地的拷貝中。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開發

子模塊技巧

  1. 子模塊遍歷

有一個 foreach 子模塊命令,它能在每個子模塊中運行任意命令。 若是項目中包含了大量子模塊,這會很是有用。rem

  1. 有用的別名

你可能想爲其中一些命令設置別名,由於它們可能會很是長而你又不能 設置選項做爲它們的默認選項。

子模塊的問題

例如在有子模塊的項目中切換分支可能會形成麻煩。 若是你建立一個新分支, 在其中添加一個子模塊,以後切換到沒有該子模塊的分支上時,你仍然會有一個還未跟蹤的子模塊目錄。

識微見遠 格物致知
相關文章
相關標籤/搜索