Git Submodule 使用簡介


參考http://www.diguage.com/archives/146.html

一、添加子模塊

從新建一個項目,或者從遠處服務器上克隆一個項目,作為“頂級項目”。這里,從 Github 上新建一個項目,然后再克隆下來:

➜   git clone git@github.com:diguage/parent.git

Cloning into 'parent'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), 4.59 KiB | 0 bytes/s, done.
Checking connectivity... done.

進入剛克隆下來的項目,我們來添加子模塊。這里的子模塊就必須從遠處服務器上克隆了。另外,子模塊可以放在項目的任意目錄下,並且可以根據自己的需要重命名。為了方便演示,所以就直接放在子目錄了。進入頂級項目,我們先看一下版本庫的狀態:

➜  cd parent
➜  git status #查看版本庫的狀態
On branch master Your branch
is up-to-date with 'origin/master'. nothing to commit, working directory clean

這里提示,項目中沒有任何需要提交的東西。下面,我們開始添加子模塊:

命令如下:git submodule add 倉庫地址 路徑

git submodule add git@github.com:diguage/child.git #添加子模塊child

Cloning into 'child'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), 4.63 KiB | 0 bytes/s, done.
Checking connectivity... done.

這時,再看一下版本庫的狀態:

➜  git status
On branch master Your branch
is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitmodules new file: child

這時,我們看到,除了剛剛添加的 child 模塊外,還多了一個 .gitmodules 文件。這個文件就是用於記錄子模塊的路徑已經遠程版本庫地址的地方。這兩個文件處於待提交的狀態。下面把這個修改提交一下。

 
        
➜   git commit -am "增加子模塊"

[master a05bfe0] 增加子模塊
 2 files changed, 4 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 child

➜   git push origin master

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 452 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:diguage/parent.git
   e56cd5a..a05bfe0  master -> master
 
        

這時,大家可以登錄到 Github 或者其他的版本庫服務器上看一下項目的狀態。至此,添加子模塊的工作已經完成。

 
        

二、更新子模塊

當我們添加完子模塊后,過段時間后,子模塊有更新,這時候,我們就需要更新了。

方式一

 
        
➜  cd child
➜  git pull origin master

remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:diguage/child
 * branch            master     -> FETCH_HEAD
   d4ec39a..1b855a4  master     -> origin/master
Updating d4ec39a..1b855a4
Fast-forward
 README.md | 3 +++
 1 file changed, 3 insertions(+)
 
        

再進入到頂級項目中,查看一下項目狀態:

➜  cd ..
➜  git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   child (new commits)

no changes added to commit (use "git add" and/or "git commit -a")

這里可以看到明顯的提示,在項目有一個新的提交。為什么這樣呢?其實,Git 在頂級項目中記錄了一個子模塊的提交日志的指針,用於保存子模塊的提交日志所處的位置,以保證無論子模塊是否有新的提交,在任何一個地方克隆下頂級項目時,各個子模塊的記錄是一致的。避免因為所引用的子模塊不一致導致的潛在問題。如果我們更新了子模塊,我們需要把這個最近的記錄提交到版本庫中,以方便和其他人協同。這也是剛剛添加完子模塊后還要在頂級項目中提交一次的原因。

➜  git commit -am "更新子模塊"

[master 5ac4dbb] 更新子模塊
 1 file changed, 1 insertion(+), 1 deletion(-)

➜   git push origin master

Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 259 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To git@github.com:diguage/parent.git
   a05bfe0..5ac4dbb  master -> master

備注:進入子模塊目錄后,你就當做這是一個獨立的項目,可以正常進行一個普通 Git 項目所執行的任何操作。更新完正常的修改、添加任務后,把所做的修改提交,然后推送到遠處版本庫上。然后,如果需要記得在頂級項目中,也做一次提交,修改一下頂級項目所引用的子模塊的提交日志的“指針”。

三、克隆項目[這個我實踐過,別的尚未實踐]

當多人合作搞一個項目,需要從遠處版本庫上克隆項目代碼。當使用git clone下來的工程中帶有submodule時,初始的時候,submodule的內容並不會自動下載下來的,此時,只需執行如下命令:git submodule update --init --recursive

即可將子模塊內容下載下來后工程才不會缺少相應的文件。

方式一(比較麻煩,但是是基礎的方式)

 
        
$ git clone https://github.com/ethz-asl/rovio.git # 第一步
Cloning into 'rovio'...
remote: Counting objects: 2759, done.
remote: Total 2759 (delta 0), reused 0 (delta 0), pack-reused 2759
Receiving objects: 100% (2759/2759), 964.96 KiB | 7.00 KiB/s, done.
Resolving deltas: 100% (1808/1808), done.
Checking connectivity... done. $ cd rovio $ git submodule update
--init --recursive # 第二步
Submodule 'lightweight_filtering' (https://bitbucket.org/bloesch/lightweight_filtering.git) registered for path 'lightweight_filtering'
Cloning into 'lightweight_filtering'...
remote: Counting objects: 1541, done.
remote: Compressing objects: 100% (921/921), done.
remote: Total 1541 (delta 691), reused 0 (delta 0)
Receiving objects: 100% (1541/1541), 319.81 KiB | 99.00 KiB/s, done.
Resolving deltas: 100% (1050/1050), done.
Checking connectivity... done.
Submodule path 'lightweight_filtering': checked out 'b1d235dca7646c013c96c9335c3d8a982b4244b5'
$ cd lightweight_filtering $ git status # 第三步
HEAD detached at b1d235d
nothing to commit, working directory clean $ git checkout master # 第四步
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
 
        

方式二(比較簡單的方式)

 
        
$ git clone --recursive https://github.com/ethz-asl/rovio.git # 第一步
$ cd rovio/lightweight_filtering # 第二步
$ git checkout master # 第三步
 
        

四、刪除子模塊

首先,要在“.gitmodules”文件中刪除相應配置信息。

然后,執行“git rm 子模塊 ”命令將子模塊所在的文件從git中刪除。

 
        
 
         
➜   git rm child  #刪除子模塊

rm 'child'

➜   git status  #查看版本庫的狀態

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage) modified: .gitmodules deleted: child ➜  git commit -am "刪除子模塊" #刪除完子模塊后還要在頂級項目中提交一次 [master b0b088b] 刪除子模塊 2 files changed, 4 deletions(-) delete mode 160000 child ➜  git push origin master Counting objects: 3, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 274 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) To git@github.com:diguage/parent.git 5ac4dbb..b0b088b master -> master
 
        

 








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM