做為一名程序員,大家對(duì) ** Git ** 肯定都不陌生,最近項(xiàng)目中用到了 Git 子模塊,今天,給大家講一下 ** Git ** 子模塊。
通常,一個(gè)大型工程總會(huì)被分拆為一些子工程。這既有利于工程開發(fā)難度的降低,也有利于使用現(xiàn)成的方案或者第三方方案作為子工程。git submodule 就是完成這樣一種子工程拆分與整合的工具。下面開始簡(jiǎn)單介紹一下 git submodule 的用法。
什么是 Submodule?
git Submodule 是一個(gè)很好的多項(xiàng)目使用共同類庫(kù)的工具,他允許類庫(kù)項(xiàng)目做為 ** repository ** ,子項(xiàng)目做為一個(gè)單獨(dú)的 git 項(xiàng)目存在父項(xiàng)目中,子項(xiàng)目可以有自己的獨(dú)立的 ** commit ,push , pull 。而父項(xiàng)目以 Submodule 的形式包含子項(xiàng)目,父項(xiàng)目可以指定子項(xiàng)目 header,父項(xiàng)目中會(huì)的提交信息包含 Submodule 的信息,再 ** clone 父項(xiàng)目的時(shí)候可以把 **Submodule **初始化。
在項(xiàng)目中使用Submodule
- 在項(xiàng)目中添加 Submodule,使用 git submodule add + 倉(cāng)庫(kù)地址,例如
git submodule add git@github.com:jjz/pod-library.git pod-library
- 查看當(dāng)前狀態(tài)
git status
On branch master
Changes to be committed:
new file: .gitmodules
new file: pod-library
可以看到多了兩個(gè)需要提交的文件:.gitmodules 和 pod-library
**.gitmodules ** 內(nèi)容包含 Submodule 的主要信息,指定 reposirory 的路徑
[submodule "pod-library"]
path = pod-library
url = git@github.com:jjz/pod-library.git
可以看到記錄了子項(xiàng)目的目錄和子項(xiàng)目的 git 地址信息。
- 另外,這兩個(gè)文件都需要提交到父項(xiàng)目的git中。
git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init
-
修改Submodule
首先需要確認(rèn)有對(duì)Submodule的commit權(quán)限,如果沒有權(quán)限,則不能提交提交代碼到父項(xiàng)目上。
進(jìn)入 Submodule 目錄里面
cd pod-library/
- 修改其中的一個(gè)文件,并且查看改動(dòng)
git status
modified: pod-library/UseAFHTTP.h
- 提交Submodule的更改內(nèi)容
git commit -a -m'test submodule'
- 然后 push 到遠(yuǎn)程服務(wù)器
git push
- 然后再回到父目錄,提交Submodule在父項(xiàng)目中的變動(dòng)
cd ..
git status
modified: pod-library (new commits)
可以看到 pod-library 中已經(jīng)變更為 Submodule 最新的 commit id
Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
- 需要把 Submodule 的變動(dòng)信息推送到父項(xiàng)目的遠(yuǎn)程服務(wù)器
git commit -m'update submodule'
git push
這樣就把子模塊的變更信息以及子模塊的變更信息提交到遠(yuǎn)程服務(wù)器了,從遠(yuǎn)程服務(wù)器上更新下來(lái)的內(nèi)容就是最新提交的內(nèi)容了。
- 更新 Submodule
更新Submodule有兩種方式
- 在父項(xiàng)目的目錄下直接運(yùn)行
git submodule foreach git pull
- 在Submodule的目錄下面更新
cd pod-library
git pull
- 克隆 Submodule
clone Submodule 有兩種方式 一種是采用遞歸的方式 clone 整個(gè)項(xiàng)目,一種是 clone 父項(xiàng)目,再更新子項(xiàng)目。
- 采用遞歸參數(shù) --recursive
git clone git@github.com:jjz/pod-project.git --recursive
執(zhí)行結(jié)果
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 會(huì)自動(dòng)被 clone 下來(lái)
- 先 clone 父項(xiàng)目,再初始化 Submodule
執(zhí)行
git clone git@github.com:jjz/pod-project.gitcd pod-project
git submodule init
會(huì)看到
Submodule 'pod-library' (git@github.com:jjz/pod-library.git)
registered for path 'pod-library'
然后更新 Submodule
git submodule update
看到輸出結(jié)果為
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,需要手動(dòng)刪除對(duì)應(yīng)的文件:
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相關(guān)的內(nèi)容,然后提交到遠(yuǎn)程服務(wù)器
git commit -a -m 'remove pod-library submodule'
Submodule 有在項(xiàng)目開發(fā)的過程中有很大的用處,希望文章對(duì)大家有幫助。