submodule 原理
submodule 是一個版本庫,跟你的主版本庫實際上是一個東西。
將 submodule add 到你的主版本庫,是將一個子版本庫的一條提交,也就是head,被主版本庫紀錄了下來。 主版本庫使用這個版本庫head之前的代碼。
git 是一個文件系統,子版本庫的remote地址和這個版本庫的head,這些紀錄究竟保存在哪里呢。
我們來具體操作一下


我在自己項目中添加了一個臨時分支,_my_br, 在這個分支下做下實驗

嘗試將sqlite作為子版本加入到主版本庫中
看一下git status


多了一個.gitmodules, 這里面包括sqlite版本庫的.git文件路徑,也就是主版本庫對子版本庫的索引


url 是子版本庫的地址,path在主版本庫中的目錄地址,子版本庫head,就存在這個目錄里,進去看以下


f69b89a078e2200fee54a9f897e6957bd627d8b7 就是引用的sqlite的head提交,可以驗證以下


一模一樣。
add submodule 就在git的文件目錄里做了以上的事情。
這是submodule的創建
如果submodule有了新的提交項,如何更新到主版本庫中的索引呢
在sqlite3中提交一項




head為4a62cb12e3e806a6a7cf016b60422182a5f93df1
回到主版本庫






把它交上去
這時候看以下主版本庫中的head


也已經更新了
后面就主版本庫子版本庫就各自push上去就可以了
submodule的更新,就一句基本滿足需求 git submodule update --init --recursive, 所有submodule都會被更新,這過程中會用到上面提到的url和head索引
submodule 刪除, 這個需要手動刪除了
.gitmodules .git/config 這兩個文件中刪除sqlite對應部分, .git/modules/ 目錄中刪除 sqlite目錄