Git submodule 倉庫中包含另外的倉庫(子倉庫)
添加 submodule
在父倉庫 git 目錄下:
git submodule add ssh://ip/[path]/xxx.git
注意:不要在ip前加username@,例如:git submodule add ssh://username@ip/[path]/xxx.git,這樣的話你就得把密碼告訴別人了,如果不加username,那么會用git config 中的user去登陸
在父倉庫添加 submodule 的時候,會讓你輸入密碼把 submodule 的內容拷貝下來,但是如果clone一個帶有 submodule 的的倉庫,那么 submodule 的文件夾內沒有任何內容,具體操作看“第一次clone一個帶有submodule的倉庫”
父倉庫的變化:
1 新增了子倉庫的內容文件夾
2 新增(如果之前沒有).gitmodules
.git/config中增加了section:
[submodule "modulename"]
3 .git/modules中增加了module的文件夾,里面有所有自倉庫的git信息文件夾
第一次 clone 一個帶有 submodule 的倉庫
方式一
git clone ssh://ip/[path]/topRepository.git 不帶任何參數,假設topRepository.git帶有submodule,那么這些submodule的文件夾里面是空的
cd topRepository 進入父倉庫
git submodule 可以看到submodule信息前有個減號'-'
git submodule init 第一次不帶參數克隆需要初始化
git submodule update 這樣就會把submodule的內容clone下來
git submodule foreach git checkout master 注意:update 后的 submodule 會被 checkout 到 head 的 commit id 上,並不會自動checkout 到 master 分支,所以這行是在所有的 submodule 中 checkout master
方式二
git clone ssh://ip/[path]/topRepository.git --recursive 這種方式會在克隆父倉庫的同時克隆submodule
cd topRepository 進入父倉庫
git submodule 可以看到submodule信息前沒有減號'-'
git submodule foreach git checkout master 注意:update 后的 submodule 會被 checkout 到 head 的 commit id 上,並不會自動checkout 到 master 分支,所以這行是在所有的 submodule 中 checkout master
如果 submodule 中還帶有 submodule,那么可以是用 --recursive 參數
父倉庫有新的 submodule 添加,或者 submodule 有新的 commit
別人在父倉庫里加了 submodule,這時候需要更新自己本地的父倉庫的 submodule
在父倉庫目錄下:
git pull
git submodule init
git submodule update
更新某個submodule:
git submodule update -- [path]
一次新 pull 所有的 submodule
在父倉庫目錄下:
git submodule foreach git pull origin master
submodule push
先在 submodule 的目錄下 push 這是單獨更新 submodule 的內容
然后在父倉庫的目錄下push 這是更新父倉庫的 submodule 信息