多个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了。
确定的结论
- Git Submodule Add后,不仅记录了子模块的Repository,还记录了Add时刻的CommitID。
- 无论何时Checkout,Submodule Update下来,还是当初那个样子。
- 有2种方式可以将子模块更新到最新
- 在子模块中,Rebase,然后在主项目提交(子模块那个目录的修改)
- 在主模块中,Submodule Update,勾选 Remote tracking branch,然后在主项目提交(子模块那个目录的修改)
- Submodule Update只会更新到记录的CommitID
- 猜测: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
- 删除 .gitsubmodule中对应submodule的条目
- 删除 .git/config 中对应submodule的条目
- 执行 git rm --cached {submodule_path}。注意,路径不要加后面的“/”。例如:你的submodule保存在 supports/libs/websocket/ 目录。执行命令为: git rm --cached supports/libs/websocket
git submodule deinit [--force] frontend/libs/echarts