轉(zhuǎn)載地址:https://segmentfault.com/a/1190000003076028
使用場(chǎng)景
基于公司的項(xiàng)目會(huì)越來越多搪桂,常常需要提取一個(gè)公共的類庫提供給多個(gè)項(xiàng)目使用,但是這個(gè)library
怎么和git
在一起方便管理呢甥厦?
我們需要解決下面幾個(gè)問題:
如何在git項(xiàng)目中導(dǎo)入
library庫
?library庫
在其他的項(xiàng)目中被修改了可以更新到遠(yuǎn)程的代碼庫中?其他項(xiàng)目如何獲取到
library庫
最新的提交?如何在clone的時(shí)候能夠自動(dòng)導(dǎo)入
library庫
?
解決以上問題,可以考慮使用git的 Submodule
來解決久橙。
什么是Submodule?
git Submodule
是一個(gè)很好的多項(xiàng)目使用共同類庫的工具茵肃,他允許類庫項(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
使用git
命令可以直接添加Submodule
:
git submodule add git@github.com:jjz/pod-library.git pod-library
使用 git status
命令可以看到
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
地址信息颜屠。
pod-libray
內(nèi)容只保護(hù)子項(xiàng)目的commit id
,就能指定到對(duì)于的git header
上,例如:
Subproject commit 4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5
4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5
就是子項(xiàng)目的commit id
鹰祸,父項(xiàng)目的git并不會(huì)記錄Submodule
的文件變動(dòng)甫窟,它是按照commit git
指定Submodule
的git header
。
另外,這兩個(gè)文件都需要提交到父項(xiàng)目的git中蛙婴。
還可以這樣使用命令添加Submodule
git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init
修改Submodule
首先需要確認(rèn)有對(duì)Submodule的commit權(quán)限粗井。
進(jìn)入Submodule
目錄里面:
cd pod-library/
修改其中的一個(gè)文件看下文件的可以用git status
查看變動(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
on branch master
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ù)器上更新下來的內(nèi)容就是最新提交的內(nèi)容了街图。
更新Submodule
更新Submodule
有兩種方式:
在父項(xiàng)目的目錄下直接運(yùn)行
git submodule foreach git pull
在Submodule的目錄下面更新
>cd pod-library
git pull
可以看到在Submodule
的目錄中,使用git
和單獨(dú)的一個(gè)項(xiàng)目是一樣的,注意更新Submodule
的時(shí)候如果有新的commit id
產(chǎn)生浇衬,需要在父項(xiàng)目產(chǎn)生一個(gè)新的提交,pod-libray文件中的 Subproject commit
會(huì)變?yōu)樽钚碌?code>commit id餐济。
clone Submodule
clone Submodule
有兩種方式 一種是采用遞歸的方式clone整個(gè)項(xiàng)目耘擂,一種是clone父項(xiàng)目,再更新子項(xiàng)目絮姆。
- 采用遞歸參數(shù)
--recursive
git clone git@github.com:jjz/pod-project.git --recursive
輸出結(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
42092b20506b0d296d90d0b5f'
可以看到init Submodule
會(huì)自動(dòng)被clone
下來
- 第二種方法先clone父項(xiàng)目梳星,再初始化
Submodule
git clone git@github.com:jjz/pod-project.git
cd pod-project
git submodule init
輸出:
Submodule 'pod-library' (git@github.com:jjz/pod-library.git)
registered for path 'pod-library'
更新Submodule
:
git submodule update
運(yùn)行結(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
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'
代碼地址:
父項(xiàng)目:https://github.com/jjz/pod-pr...
子項(xiàng)目:https://github.com/jjz/pod-li...