git submodule 相關操做解析

做者:shede333
主頁:http://my.oschina.net/shede333
版權聲明:原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | [Creative Commons BY-NC-ND 3.0][]git


##1.添加submodule庫服務器

git submodule add {subLib path}
前提是 submodule庫已經在本地{sublib path}了;
注意: {sublib path}的格式,若是就在根目錄,使用./文件夾名的格式 項目中主要有3個改變:工具

  1. modified:.git/config
  2. add:.gitmodules
  3. add:submodule的文件夾

git submodule status
此時已經能夠看到submodule庫hash信息fetch

git st
.gitmodules和庫名文件夾,須要commit. 此時 .git/config 和 .gitmodules 中都出現了關於submodule的信息.net

git commit -m "add submodule"
加載submodule步驟完成命令行

##2.clone 帶submodule的項目code

**強烈推薦:**有個簡單快捷的方法:遞歸

git clone {項目路徑} --recurse

這個命令就是遞歸clone主庫以及相關的submodule,全部庫的代碼都被下載下來get

若是用git clone {項目路徑},步驟就稍微麻煩點,可是能一步步看看原理hash

git clone {項目路徑}
只clone主庫,submodule庫的代碼並無下載下來 能夠看到:

  1. .gitmodules存在,裏面包含了submodule的信息;
  2. submodule文件夾存在,可是文件夾是空的; 3..git/config 裏沒有submodule庫的信息

git st
沒有發現有更改的地方.

git submodule status
能夠看到submodule庫hash信息,可是前面帶有減號"-",就是說submodule尚未檢出, 下面咱們就開始下載submodule庫

git submodule init
其實是利用當前目錄下的.gitmodules文件裏的信息,修改了.git/config文件,在該文件內註冊了submodule庫

cat .git/config
查看該文件,能夠看到出現了submodule庫的相關信息

git submodule update
將submodule庫下載check out出來

##3.submodule 改動、上傳

先假設submodule 有修改,但未commit,

則在主庫 git status
能夠看到:「submodule的更改,須要 git add (modified content)」
接着在子庫 git commit了修改,
則在主庫git status能夠看到:「submodule的更改,須要git add (new commits)」
接着 git submodule status :
看到submodule前面有加號"+",並且submodule庫的hash信息改成最新。

git add .
接着 git submodule status:
看到submodule前面加號"+"消失了。

git commit -m "submodule modified"
這樣就把submodule庫的修改添加到主庫。
可是還沒完,還沒push呢,這個很重要。
submodule修改commit完成後,儘早push, 由於,submodule的修改添加到了主庫,而submodule沒push,但主庫push了,那麼,其餘人把主庫pull以後,會找不到submodule,由於submodule庫還在本地,沒push到服務器,其餘人拿不到。 因此submodule修改commit以後就儘早push到服務器 這時候主庫再push就不會給別人形成麻煩了

##4.submodule庫與主庫,更新,協做

如今假設,同事對submodule庫作了更改,submodule庫也push,主庫對submodule庫的更改也push了, 我應該怎樣更新項目。下面是我對本身庫的部分操做

git pull
根據命令行的輸出,能夠看見,主庫和submodule庫都從服務器拉取了最新的代碼, 可是submodule庫,並無把最新信息合併到master分支上.
我懷疑,主庫使用了git pull,但對submodule庫只用了git fetch

git st
submodule庫有modified: *** (new commits)

git submodule status
看到submodule庫的hash信息沒變,並且前有加號"+",說明主庫記錄的關於submodule庫的信息, 與submodule庫的當前信息不符,主庫記錄的信息過期,須要更新submodule庫

進入submodule庫
git st
提示當前master分支 落後於主分支一個commit.

回到主庫
git submodule update
這個操做會把submodule信息更新,即主庫會指向子庫的最新commit信息,與服務器上的同樣。

git submodule status
submodule庫已經指向了最新的,
可是仔細看看最後的部分,其實submodule庫目前指向的並非master分支,仍是一個遊離分支 但這不影響主庫的狀態,主庫看到的依然是submodule庫最新的代碼。

進入submodule庫
git branch
發現當前的分支並非master,而是遊離分支,該分支的head-hash信息,與主庫記錄的submodule庫的hash信息相同,說明,雖然兩個庫都拉取了最新的代碼,可是submodule庫的指向並無自動改變,這個須要咱們收到來更新submodule信息


##題外話

若是你想更改submodule庫,則須要進入submodule庫,執行一下命令,更新submodule庫的master分支信息,同時不影響主庫
git checkout master
git pull
這樣操做後,submodule庫的當前分支就從遊離分支切換到master,可是以前的遊離分支和如今的master分支的head指向同一個commit,因此不會對主庫形成影響。

##參考

6.6 Git 工具 - 子模塊

相關文章
相關標籤/搜索