Git - 子模塊

做為一名程序員,大家對(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有兩種方式
  1. 在父項(xiàng)目的目錄下直接運(yùn)行
git submodule foreach git pull
  1. 在Submodule的目錄下面更新
cd pod-library
git pull
  • 克隆 Submodule
    clone Submodule 有兩種方式 一種是采用遞歸的方式 clone 整個(gè)項(xiàng)目,一種是 clone 父項(xiàng)目,再更新子項(xiàng)目。
  1. 采用遞歸參數(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)

  1. 先 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ì)大家有幫助。

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 使用場(chǎng)景 基于公司的項(xiàng)目會(huì)越來(lái)越多,常常需要提取一個(gè)公共的類庫(kù)提供給多個(gè)項(xiàng)目使用,但是這個(gè)library怎么和gi...
    0xSen閱讀 18,742評(píng)論 1 26
  • git子模塊的使用 git子模塊可以用于項(xiàng)目包含另一個(gè)項(xiàng)目的情況,也許是第三方庫(kù)或被多個(gè)項(xiàng)目引用的基礎(chǔ)框架。此次學(xué)...
    看似平淡閱讀 3,114評(píng)論 0 0
  • 寫在前面: 1、使用Git Submodule可能遇到的坑(http://blog.devtang.com/201...
    Funnyer閱讀 6,062評(píng)論 0 0
  • 好幾年前腦子里就住進(jìn)了一個(gè)童話 主角是一只 雪白的 放電影的 熊 在森林深處一個(gè)祥和的小村中 電影放映員熊君每天負(fù)...
    深藏攻與名閱讀 314評(píng)論 0 1
  • 今天是一個(gè)值得紀(jì)念的日子,二零一柒年二月二十二日。今天下雪了,是兒子生命中第一場(chǎng)雪。 兒子五歲了,一直以來(lái)都欠他一...
    6cb106582cd2閱讀 802評(píng)論 0 3

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