做為一名程序員,大家對 ** Git ** 肯定都不陌生,最近項目中用到了 Git 子模塊,今天,給大家講一下 ** Git ** 子模塊。
通常,一個大型工程總會被分拆為一些子工程。這既有利于工程開發難度的降低,也有利于使用現成的方案或者第三方方案作為子工程。git submodule
就是完成這樣一種子工程拆分與整合的工具。下面開始簡單介紹一下 git submodule
的用法。
什么是 Submodule?
git Submodule
是一個很好的多項目使用共同類庫的工具,他允許類庫項目做為 ** repository ** ,子項目做為一個單獨的 git 項目存在父項目中,子項目可以有自己的獨立的 ** commit ,push , pull 。而父項目以 Submodule 的形式包含子項目,父項目可以指定子項目 header,父項目中會的提交信息包含 Submodule 的信息,再 ** clone 父項目的時候可以把 **Submodule **初始化。
在項目中使用Submodule
- 在項目中添加 Submodule,使用 git submodule add + 倉庫地址,例如
git submodule add git@github.com:jjz/pod-library.git pod-library
- 查看當前狀態
git status
On branch master
Changes to be committed:
new file: .gitmodules
new file: pod-library
可以看到多了兩個需要提交的文件:.gitmodules 和 pod-library
**.gitmodules ** 內容包含 Submodule 的主要信息,指定 reposirory 的路徑
[submodule "pod-library"]
path = pod-library
url = git@github.com:jjz/pod-library.git
可以看到記錄了子項目的目錄和子項目的 git 地址信息。
- 另外,這兩個文件都需要提交到父項目的git中。
git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init
-
修改Submodule
首先需要確認有對Submodule的commit權限,如果沒有權限,則不能提交提交代碼到父項目上。
進入 Submodule 目錄里面
cd pod-library/
- 修改其中的一個文件,并且查看改動
git status
modified: pod-library/UseAFHTTP.h
- 提交Submodule的更改內容
git commit -a -m'test submodule'
- 然后 push 到遠程服務器
git push
- 然后再回到父目錄,提交Submodule在父項目中的變動
cd ..
git status
modified: pod-library (new commits)
可以看到 pod-library 中已經變更為 Submodule 最新的 commit id
Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
- 需要把 Submodule 的變動信息推送到父項目的遠程服務器
git commit -m'update submodule'
git push
這樣就把子模塊的變更信息以及子模塊的變更信息提交到遠程服務器了,從遠程服務器上更新下來的內容就是最新提交的內容了。
- 更新 Submodule
更新Submodule有兩種方式
- 在父項目的目錄下直接運行
git submodule foreach git pull
- 在Submodule的目錄下面更新
cd pod-library
git pull
- 克隆 Submodule
clone Submodule 有兩種方式 一種是采用遞歸的方式 clone 整個項目,一種是 clone 父項目,再更新子項目。
- 采用遞歸參數 --recursive
git clone git@github.com:jjz/pod-project.git --recursive
執行結果
loning into 'pod-project'...
remote: Counting objects: 57, done.
remote: Compressing objects: 100 % (45 / 45), done.
remote: Total 57(delta 13), reused 49(delta 8), pack - reused 0
Receiving objects: 100 % (57 / 57), 18.79 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (13 / 13), done.
Checking connectivity...done.
Submodule 'pod-library' (git @github.com: jjz / pod - library.git) registered
for path 'pod-library'
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100 % (25 / 25), done.
remote: Total 34(delta 8), reused 30(delta 7), pack - reused 0
Receiving objects: 100 % (34 / 34), 12.95 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (8 / 8), done.
Checking connectivity...done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c
42092 b20506b0d296d90d0b5f '
可以看到 init Submodule 會自動被 clone 下來
- 先 clone 父項目,再初始化 Submodule
執行
git clone git@github.com:jjz/pod-project.gitcd pod-project
git submodule init
會看到
Submodule 'pod-library' (git@github.com:jjz/pod-library.git)
registered for path 'pod-library'
然后更新 Submodule
git submodule update
看到輸出結果為
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100 % (25 / 25), done.
remote: Total 34(delta 8), reused 30(delta 7), pack - reused 0
Receiving objects: 100 % (34 / 34), 12.95 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (8 / 8), done.
Checking connectivity...done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'
所以,用兩種方法都能初始化 Submodule
- 刪除 Submodule
git 并不支持直接刪除 Submodule,需要手動刪除對應的文件:
cd pod-project
git rm --cached pod-library
rm -rf pod-library
rm .gitmodules
更改 git 的配置文件 config
vim .git/config
可以看到 Submodule 的配置信息:
[submodule "pod-library"]
url = git@github.com:jjz/pod-library.git
刪除submodule相關的內容,然后提交到遠程服務器
git commit -a -m 'remove pod-library submodule'
Submodule 有在項目開發的過程中有很大的用處,希望文章對大家有幫助。