k8w.io
Git Submodule的用法
2017-11-20作者:k8w

多个Git项目需要共享代码,又不想使用npm之类的包管理系统?
试试Git自带的Submodule功能吧~

Submodule介绍

TODO

使用方法

使用TortoiseGit

新建两个仓库 TestA TestB

在TestA中 git submodule Add TestB 到 TestA/TestB 下

此时 TestA中有 a1.txt
TestB中有b1.txt

在TestA/TestB中新建一个b2.txt,然后在此目录Commit&Push。
TestB中多处了b2.txt。

重新Checkout一份TestA为TestA1,发现TestA/TestB中只有b1没有b2。

在TestA中Commit&Push(改动的内容是 Path:TestB Modified)后,
TestA1 Rebase,TestA1/TestB中只有b1没有b2,
TestA1 Submodule Update后,TestA1/TestB中出现b2。

在TestB中Fetch&Rebase,Remote Branch为空,没有出现b2。
在TestB中Fetch&Rebase,Remote Branch为remote/master,出现b2。

在TestB中新建b3.txt,
在TestA中Update Submodule,b3没有出现,Sync Submodule b3也没有出现。
再次Submodule Update,勾选了 Rebase,b3没有出现。
再次Submodule Update,勾选了 Rebase 和 Remote tracking branch后,b3出现!

在TestB中新建b4
再次Submodule Update,只勾选了 Remote tracking branch后,b4出现!
再次Submodule Update,不勾选 Remote tracking branch后,只剩b1,b2了。

确定的结论

  1. Git Submodule Add后,不仅记录了子模块的Repository,还记录了Add时刻的CommitID。
  2. 无论何时Checkout,Submodule Update下来,还是当初那个样子。
  3. 有2种方式可以将子模块更新到最新
    1. 在子模块中,Rebase,然后在主项目提交(子模块那个目录的修改)
    2. 在主模块中,Submodule Update,勾选 Remote tracking branch,然后在主项目提交(子模块那个目录的修改)
  4. Submodule Update只会更新到记录的CommitID
  5. 猜测:Submodule Sync只是将子模块的信息(如CommitID)同步回来

NPM

可通过如下方式直接安装git作为npm install

npm install git+[http://](http://%E7%94%A8%E6%88%B7%E5%90%8D:%E5%AF%86%E7%A0%81@git.longsheng1919.com/xxx/xxx)[用户名](http://%E7%94%A8%E6%88%B7%E5%90%8D:%E5%AF%86%E7%A0%81@git.longsheng1919.com/xxx/xxx)[:](http://%E7%94%A8%E6%88%B7%E5%90%8D:%E5%AF%86%E7%A0%81@git.longsheng1919.com/xxx/xxx)[密码](http://%E7%94%A8%E6%88%B7%E5%90%8D:%E5%AF%86%E7%A0%81@git.longsheng1919.com/xxx/xxx)[@](http://%E7%94%A8%E6%88%B7%E5%90%8D:%E5%AF%86%E7%A0%81@git.longsheng1919.com/xxx/xxx)[git.longsheng1919.com/xxx/xxx](http://%E7%94%A8%E6%88%B7%E5%90%8D:%E5%AF%86%E7%A0%81@git.longsheng1919.com/xxx/xxx)[ ](http://%E7%94%A8%E6%88%B7%E5%90%8D:%E5%AF%86%E7%A0%81@xn--githttp--save-k50uf77hlha958h/)--save

注意:Docker中无git,所以npm install之前 要手工把node_modules

删除Submodule

  1. 删除 .gitsubmodule中对应submodule的条目
  2. 删除 .git/config 中对应submodule的条目
  3. 执行 git rm --cached {submodule_path}。注意,路径不要加后面的“/”。例如:你的submodule保存在 supports/libs/websocket/ 目录。执行命令为: git rm --cached supports/libs/websocket
git submodule deinit [--force] frontend/libs/echarts
(正文完)
留言(0条)
发表新留言
您的大名:
必填
电子邮箱:
不公开,仅用于向你发送回复