近期项目中遇到一个git问题,想把一个公共库项目用共享模式让在多个工程中运用。SVN有外链模式,目录共享非常方便,无奈git不像svn可以直接通过外链模式把某个目录共享给其他工程,所以只能用submodule模式。
于是百度一下git submodule,发现好多博客都介绍,看的手痒,所以也就写一份git-submodule。
推荐:本博客需要有git应用基础的人阅读
一、工程应用模型
一般submodule应用时都是存在多个工程需要使用同一个公共模块,这个公共模块相对于主工程独立——独立仓库、分支、更改日志。
公共模块可以跟独立的仓库一样进行版本管理。
二、构建git-submodule关系
1. 分别为ProjectA、ProjectB、CommonModule三个工程创建git版本管理;
这里就不用写命令了,大家都明白。
2. 为工程ProjectA、ProjectB添加git-submodule子工程CommonModule;
例如为ProjectA操作,命令如下
操作预期:ProjectA添加CommonModule为git-submodule(目标目录:submodules/CommonModule)的命令如下,
$ git submodule add https://github.com/SweetTool/CommonModule.git submodules/CommonModule
操作结果:
在执行完项目后ProjecA在.git目录下的仓库地址:ProjectA/.git/modules/submodules/CommonModule
.git文件的内容:
gitdir: ../../.git/modules/submodules/CommonModule
如图
运行命令查看submodule状态( git submodule status)
ProjectA$ git submodule status
+f698c972e74999ac2713b85ffcc187c4b9863432 submodules/CommonModule (heads/master)
三、git-submodule的更新维护
只需要到submodule所在的工程文件目录下运行git命令即可
例如ProjectA就到目录:ProjectA/submodules/CommonModule下运行git命令;当然,也可以用乌龟TortoiseGit软件在这个目录进行操作——更新、提交日志、切换分支。
附录:三个工程的GitHub地址
https://github.com/SweetTool/CommonModule.git
https://github.com/SweetTool/ProjectA.git
https://github.com/SweetTool/ProjectB.git
附录二、目录结构
没有版本管理下的文件目录结构
./CommonModule
./CommonModule/ReadmeCommon.txt
./CommonModule/src
./CommonModule/src/CommonUtils.java
./ProjectA
./ProjectA/ReadmeA.txt
./ProjectA/src
./ProjectA/src/HelloA.java
./ProjectB
./ProjectB/ReadmeB.txt
./ProjectB/src
./ProjectB/src/HelloB.java
有git工程的目录结构
./CommonModule/.git/ORIG_HEAD
./CommonModule/.git/config
./CommonModule/.git/objects
./CommonModule/.git/HEAD
./CommonModule/.git/info
./CommonModule/.git/logs
./CommonModule/.git/description
./CommonModule/.git/hooks
./CommonModule/.git/refs
./CommonModule/.git/index
./CommonModule/.git/COMMIT_EDITMSG
./CommonModule/.git/FETCH_HEAD
./CommonModule/src/CommonUtils.java
./ProjectA/submodules/CommonModule
./ProjectA/.git/config
./ProjectA/.git/objects
./ProjectA/.git/HEAD
./ProjectA/.git/info
./ProjectA/.git/logs
./ProjectA/.git/description
./ProjectA/.git/hooks
./ProjectA/.git/refs
./ProjectA/.git/index
./ProjectA/.git/modules
./ProjectA/.git/COMMIT_EDITMSG
./ProjectA/src/HelloA.java
./ProjectB/submodules/CommonModule
./ProjectB/.git/config
./ProjectB/.git/objects
./ProjectB/.git/HEAD
./ProjectB/.git/info
./ProjectB/.git/logs
./ProjectB/.git/description
./ProjectB/.git/hooks
./ProjectB/.git/refs
./ProjectB/.git/index
./ProjectB/.git/modules
./ProjectB/.git/COMMIT_EDITMSG
./ProjectB/src/HelloB.java