使用Git Submodule管理子模塊

實(shí)例代碼:
父項(xiàng)目:https://github.com/jjz/pod-project
子項(xiàng)目:https://github.com/jjz/pod-library

使用場(chǎng)景

基于公司的多項(xiàng)目,我們提取了一個(gè)公共的類庫(kù)提供給多個(gè)項(xiàng)目使用,但是這個(gè)library怎么和git在一起方便的管理呢?
需要解決以下的幾個(gè)問(wèn)題:

  • 如何在git項(xiàng)目中導(dǎo)入library庫(kù)?
  • library庫(kù)在其他的項(xiàng)目中被修改了如何push?
  • 其他項(xiàng)目如何獲取到library庫(kù)最新的提交?
  • 如何在clone的時(shí)候能夠自動(dòng)導(dǎo)入library庫(kù)?

解決以上問(wèn)題,我使用git 的Submodule來(lái)解決。

什么是Submodule?

git Submodule 是一個(gè)很好的項(xiàng)目協(xié)作工具,他允許類庫(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

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 內(nèi)容

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

這里記錄了子項(xiàng)目的目錄和子項(xiàng)目的git信息

pod-libray
Subproject commit 4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5

這里是子項(xiàng)目的commit的id,git并不會(huì)記錄Submodule的文件變動(dòng),它是按照這個(gè)commit的git來(lái)對(duì)比Submodule的變動(dòng)的

這兩個(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目錄里面,對(duì)修改的文件進(jìn)行提交

cd pod-library/

我們修改了其中的一個(gè)文件看下文件的變動(dòng)

git status

    modified:   pod-library/UseAFHTTP.h

commit submodule

git commit -a -m'test submodule'

push 到遠(yuǎn)端
>git push

然后再回到父目錄:

cd ..
git status
on branch master


    modified:   pod-library (new commits)

可以看到pod-library已經(jīng)變更為最新的commit id

Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
我們需要把推送到父項(xiàng)目的遠(yuǎn)端

git commit -m'update submodule'
git push

更新Submodule

更新的方法有兩種:

  • 在父項(xiàng)目的目錄下運(yùn)行

git submodule foreach git pull

  • 在Submodule的目錄下面更新

    cd pod-library
    git pull

注意更新Submodule的時(shí)候如果有新的commit id產(chǎn)生,需要在父項(xiàng)目產(chǎn)生一個(gè)新的提交,pod-libray文件中的 Subproject commit會(huì)變?yōu)樽钚碌?code>commit id

在clone的時(shí)候初始化Submodule

  • 采用遞歸參數(shù) --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

42092b20506b0d296d90d0b5f'

會(huì)自動(dòng)init Submodule

或者使用第二種方法
先clone父項(xiàng)目

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'

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

git 并不支持直接刪除Submodule需要手動(dòng)刪除對(duì)應(yīng)的文件

cd pod-project
git rm --cached pod-library
rm -rf pod-library
rm .gitmodules

 vim .git/config
  [submodule "pod-library"]
      url = git@github.com:jjz/pod-library.git
   刪除submodule相關(guān)的內(nèi)容
 git commit -a -m 'remove pod-library submodule'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容