Git - 子模塊

做為一名程序員,大家對 ** Git ** 肯定都不陌生,最近項目中用到了 Git 子模塊,今天,給大家講一下 ** Git ** 子模塊。

通常,一個大型工程總會被分拆為一些子工程。這既有利于工程開發(fā)難度的降低,也有利于使用現(xiàn)成的方案或者第三方方案作為子工程。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
  • 查看當前狀態(tài)
git status
On branch master
 Changes to be committed:
       new file: .gitmodules 
       new file: pod-library

可以看到多了兩個需要提交的文件:.gitmodules 和 pod-library
**.gitmodules ** 內(nèi)容包含 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權(quán)限,如果沒有權(quán)限,則不能提交提交代碼到父項目上。

  • 進入 Submodule 目錄里面

cd pod-library/
  • 修改其中的一個文件,并且查看改動
git status
modified: pod-library/UseAFHTTP.h
  • 提交Submodule的更改內(nèi)容
git commit -a -m'test submodule'
  • 然后 push 到遠程服務(wù)器
git push
  • 然后再回到父目錄,提交Submodule在父項目中的變動
cd ..
git status
modified: pod-library (new commits)

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

Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
  • 需要把 Submodule 的變動信息推送到父項目的遠程服務(wù)器
git commit -m'update submodule'
git push

這樣就把子模塊的變更信息以及子模塊的變更信息提交到遠程服務(wù)器了,從遠程服務(wù)器上更新下來的內(nèi)容就是最新提交的內(nèi)容了。

  • 更新 Submodule
    更新Submodule有兩種方式
  1. 在父項目的目錄下直接運行
git submodule foreach git pull
  1. 在Submodule的目錄下面更新
cd pod-library
git pull
  • 克隆 Submodule
    clone Submodule 有兩種方式 一種是采用遞歸的方式 clone 整個項目,一種是 clone 父項目,再更新子項目。
  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 會自動被 clone 下來

  1. 先 clone 父項目,再初始化 Submodule
    執(zhí)行
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

看到輸出結(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,需要手動刪除對應(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)容,然后提交到遠程服務(wù)器

git commit -a -m 'remove pod-library submodule'

Submodule 有在項目開發(fā)的過程中有很大的用處,希望文章對大家有幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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