文章目录
  1. 1. 添加第三方包
  2. 2. 删除第三方包
  3. 3. 下载的工程带有submodule
  4. 4. 问题

现在golang已经可以通过vendor来管理第三方依赖包了,但是之前的一个老项目用的是git submodule来管理的,但是.gitsubmodule文件中只记录管理了项目的部分依赖包, 需要把还没有被管理的第三包也加上,下面总结使用git submodule的过程。

添加第三方包

为当前工程添加submodule,命令如下:

1
git submodule add 仓库地址 保存路经路径

例如要为gomail包添加submodule管理,
gomail包 仓库地址: https://github.com/go-gomail/gomail.git
gomail包要保存在项目里的路经为: src/github.com/go-gomail/gomail, 则命令为:

1
git submodule add https://github.com/go-gomail/gomail   src/github.com/go-gomail/gomail

但是老项目遇到的情况是在保存路经src/github.com/go-gomail/gomail中已经存在gomail, 这里只是需要把这个第三包用git submodule记录下来编译管理, 所以需要加一个强制参数, 则命令为如下:

1
git submodule add -f https://github.com/go-gomail/gomail   src/github.com/go-gomail/gomail

其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)

命令执行完成,会在当前工程根路径下生成一个名为.gitmodules的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。

删除第三方包

submodule的删除稍微麻烦点:首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。

下载的工程带有submodule

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

1
git submodule update --init --recursive

即可将子模块内容下载下来后工程才不会缺少相应的文件。

问题

当第三包被git submodule记录之后,git status命令会出现下面的情况,

1
2
$ git status vendor | grep modified:
# modified: vendor/rails (modified content)

1
2
3
4
5
6
7
$ git diff vendor/
diff --git a/vendor/rails b/vendor/rails
--- a/vendor/rails
+++ b/vendor/rails
@@ -1 +1 @@
-Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f
+Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

如何让git status不显示那个modified content呢?
修改.gitmodule文件, 在显示modified content的第三包管理下添加一个ignore = dirty, 如下:

1
2
3
4
[submodule "bundle/fugitive"]
path = bundle/fugitive
url = git://github.com/tpope/vim-fugitive.git
ignore = dirty

上述三个步骤一般就能解决问题了, 如果想深入理解git submodule,可进一步参考git submodule使用完整教程

作者署名:朴实的一线攻城狮
本文标题:git submodule使用总结
本文出处:http://researchlab.github.io/2017/01/18/git-submodule/
版权声明:本文由Lee Hong创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处, 否则保留追究法律责任的权利。

@一线攻城狮

关注微信公众号 @一线攻城狮

总访问:
总访客: