如何为一个项目增加submodule
在 git 项目中,可以使用下面的命令,为其增加submodule 
(假设需要增加的项目的 url 为 git@github.com:violatangxl/xxx.git, 分支为mod-develop,path 为 sub)
1  | git submodule add -b mod-develop git@github.com:violatangxl/xxx.git sub  | 
执行之后,会发现当前项目下有了一个.gitmodules 文件,文件内容是
1  | [submodule "sub"]  | 
 同时,.git/config文件也会增加
 
1  | [submodule "sub"]  | 
(注意着两个地方的修改,当有 submodule 删除时,要用到)
执行
1  | git submodule update --init  | 
可以从远程拉取相关的代码到submodule中了。
然后就可以看到文件目录多了一个sub的文件夹,里面就是拉下来的子模块的代码。
同时在 .git/modules/module_path/目录也可以看到sub相关的代码了。
这里有个我自己尝试的 case,当时我的目录结构是
1  | .  | 
即实际项目代码都在/src 目录下,与.git、go.mod不在一层,作为小白的我不知道能不能在src目录下引入submodule。
(其实盲猜应该是可以) 为了验证便在src目录下执行了submodule add命令,发现的确是可以的,添加后的.gitmodules中的 path,就是src/sub
修改 submodule
前面提到了在src路径下尝试 submodule add,自然就有在与文件.git同级下的add操作,所以就涉及到了已有submodule的删除(修改)操作。如果之前的submodule没有移除干净,再次的add会报以下问题 If the local git directory is not the correct repo or you are unsure what this means choose another name with the '--name' option. 
移除已有submodule的主要步骤如下:
- 将
submodule移除git版本控制git rm --cached ub - 移除
.gitmodules
移除.gitmodules(当然,如果项目中有多个submodule,只删除掉需要删除的,即上文提到的bash1
2
3
4[submodule "sub"]
path = sub
url = git@github.com:violatangxl/xxx.git
branch = mod-develop - 修改
.git/config
移除.git/config中增加的bash1
2
3[submodule "sub"]
url = git@github.com:violatangxl/xxx.git
active = true - 删除 
.git/modules/中的相关代码大功告成~bash1
rm -rf .git/modules/sub
 
然后就可以重新add继续折腾了。
这篇文章的由来,是因为作为一向对项目管理,以及gopath不熟悉的小白的我,下定决心把一个历史悠久,依旧使用glide的项目,改为使用go mod进行依赖管理,这种事情看多少遍文章,还是不如自己折腾一遍。过程中间断断续续了解了一些相关的知识,当然最终也是搞定了,还是十分开森的。特此记录一下过程中使用的主要流程性命令。


