1. 程式人生 > >[轉]使用Git Submodule管理子模組

[轉]使用Git Submodule管理子模組

本文轉自:https://blog.csdn.net/qq_37788558/article/details/78668345

例項程式碼: 父專案:https://github.com/jjz/pod-project 子專案:https://github.com/jjz/pod-library

使用場景

基於公司的多專案,我們提取了一個公共的類庫提供給多個專案使用,但是這個library怎麼和git在一起方便的管理呢? 需要解決以下的幾個問題:

  • 如何在git專案中匯入library庫?
  • library庫在其他的專案中被修改瞭如何push?
  • 其他專案如何獲取到library庫最新的提交?
  • 如何在clone的時候能夠自動匯入library庫?

解決以上問題,我使用git 的Submodule來解決。

什麼是Submodule?

git Submodule 是一個很好的專案協作工具,他允許類庫專案做為repository,子專案做為一個單獨的git專案存在父專案中,子專案可以有自己的獨立的commit,push,pull。而父專案以Submodule的形式包含子專案,父專案可以指定子專案header,父專案中會提交 Submodule的資訊,在clone父專案的時候可以把Submodule初始化。

在專案中新增Submodule

git submodule add 

[email protected]:jjz/pod-library.git pod-library

使用 git status命令可以看到

  1.   git status
  2.    
  3.    
  4.   On branch master
  5.   Changes to be committed:
  6.    
  7.   new file: .gitmodules
  8.   new file: pod-library

多了兩個需要提交的檔案
gitmodules 內容

  1.   [submodule "pod-library"]
  2.   path = pod-library
  3.   url = git @github.com:jjz/pod-library.git

這裡記錄了子專案的目錄和子專案的git資訊

  1.   pod-libray
  2.   Subproject commit 4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5

這裡是子專案的commit的id,git並不會記錄Submodule的檔案變動,它是按照這個commit的git來對比Submodule的變動的

這兩個檔案都需要提交到父專案的git中

我們還可以這樣新增Submodule

  1.   git add .gitmodules pod-ibrary
  2.   git commit -m "pod-library submodule"
  3.   git submodule init

修改提交Submodule

首先要確認有對Submodule的commit許可權
進入Submodule目錄裡面,對修改的檔案進行提交

cd pod-library/

我們修改了其中的一個檔案看下檔案的變動

  1.   git status
  2.    
  3.   modified: pod- library/UseAFHTTP.h

commit submodule

git commit -a -m'test submodule'

push 到遠端
>git push

然後再回到父目錄:

  1.   cd ..
  2.   git status
  3.   on branch master
  4.    
  5.    
  6.   modified: pod-library ( new commits)

可以看到pod-library已經變更為最新的commit id

Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
我們需要把推送到父專案的遠端

  1.   git commit - m'update submodule'
  2.   git push

更新Submodule

更新的方法有兩種:

  • 在父專案的目錄下執行

git submodule foreach git pull

  • 在Submodule的目錄下面更新

    cd pod-library
    git pull

注意更新Submodule的時候如果有新的commit id產生,需要在父專案產生一個新的提交,pod-libray檔案中的 Subproject commit會變為最新的commit id

在clone的時候初始化Submodule

  • 採用遞迴引數 --recursive

git clone [email protected]:jjz/pod-project.git --recursive

  1.   loning into 'pod-project'...
  2.   remote: Counting objects: 57, done.
  3.   remote: Compressing objects: 100% (45/45), done.
  4.   remote: Total 57 (delta 13), reused 49 (delta 8), pack-reused 0
  5.   Receiving objects: 100% (57/57), 18.79 KiB | 0 bytes/s, done.
  6.   Resolving deltas: 100% (13/13), done.
  7.   Checking connectivity... done.
  8.   Submodule 'pod-library' ([email protected]:jjz/pod-library.git) registered for path 'pod-library'
  9.   Cloning into 'pod-library'...
  10.   remote: Counting objects: 34, done.
  11.   remote: Compressing objects: 100% (25/25), done.
  12.   remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
  13.   Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
  14.   Resolving deltas: 100% (8/8), done.
  15.   Checking connectivity... done.
  16.   Submodule path 'pod-library': checked out '330417cf3fc1d2c
  17.    
  18.   42092b20506b0d296d90d0b5f'

會自動init Submodule

或者使用第二種方法
先clone父專案

git clone [email protected]:jjz/pod-project.git
cd pod-project
git submodule init

  1.   Submodule 'pod-library' (git@github.com:jjz/pod-library.git)
  2.   registered for path 'pod-library'

git submodule update

  1.   Cloning into 'pod-library'...
  2.   remote: Counting objects: 34, done.
  3.   remote: Compressing objects: 100% (25/25), done.
  4.   remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
  5.   Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
  6.   Resolving deltas: 100% (8/8), done.
  7.   Checking connectivity... done.
  8.   Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'

刪除Submodule

git 並不支援直接刪除Submodule需要手動刪除對應的檔案

  1.   cd pod-project
  2.   git rm --cached pod-library
  3.   rm -rf pod-library
  4.   rm .gitmodules
  5.    
  6.   vim .git/config
  7.   [submodule "pod-library"]
  8.   url = git @github.com:jjz/pod-library.git
  9.   刪除submodule相關的內容
  10.   git commit -a -m 'remove pod-library submodule'



作者:姜家志
連結:http://www.jianshu.com/p/d433d3417a19
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。