Git Submodule学习

项目的版本库在某些情况下需要引用其他版本库中的文件,例如公司积累了一套常用的函数库,被多个项目调用,显然这个函数库的代码不能直接放到某个项目的代码中,而是要独立为一个代码库。

那么其他项目要调用公共函数库该如何处理呢?分别把公共函数库的文件拷贝到各自的项目中会造成冗余,丢弃了公共函数库的维护历史,这显然不是好的方法。

这种情况就可以使用Git Submodule。

简介

其实就是主模块是一个Git工程,里面又有好几个Git工程(子模块),而主模块与子模块之间的关系是由一个.gitmodules文件去控制的,这个文件里面包含了子模块路径、子模块的远程仓库、子模块的版本号。

常用命令

添加子模块

  • 模块A的本地目录为:projectA
  • 希望引用模块B为模块A的子模块,其在模块A目录下的路径为:projectA/projectB
1
2
cd projectA
git submodule add projectB.git projectB

其实这样是在.gitsubmodules文件中添加了如下几行:

1
2
3
4
[submodule "projectB"]
path = projectA/projectB
url = https://github.com/tding/projectB.git
branch = master

本地拉取子模块

当使用git clone下来的工程中带有submodule时,初始的时候submodule的内容并不会自动下载下来的,主模块中的子模块只有一个空文件夹,此时,只需执行如下命令:

1
git submodule update --init --recursive

这样可以将子模块内容下载下来,工程才不会缺少相应的文件。

常见问题

认证失败

拉取项目Submodule的代码时,一直报remote: Coding 提示: Authentication failed! 认证失败,请确认您输入了正确的账号密码,后面发现是因为密码保存在凭据管理器中(控制面板–>凭据管理器),然后Git的密码其实早就改过了,因此,更新了这个密码后,可以正常拉取了。

更新的办法是删除掉老的这个密码凭据,然后再次拉取的时候会跳出来一个输入密码的弹框,输入后下载成功,同时自动将密码保存成凭据了,下次也就不需要再次输入了。

子模块分支处于detached状态

每次执行git submodule update --remote后,子模块会处于detached状态,例如:

1
2
3
4
$ cd ./projectB
$ git branch
* (HEAD detached at ac4d1fc)
master

设计如此,没有太好的解决办法:

It’s also important to realize that a submodule reference within the host repository is not a reference to a specific branch of that submodule’s project, it points directly to a specific commit (or SHA1 reference), it is not a symbolic reference such as a branch or tag. In technical terms, it’s a detached HEAD pointing directly to the latest commit as of the submodule add.

因此在改动子项目代码之前,需要手动切换到master分支。

参考


----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡

欢迎关注我的其它发布渠道