Git子模块使用记录

本文仅用于记录自己在使用git submodule时遇到的问题。

参考资料

知乎:git submodule的理解
知乎:git中submodule的使用

一些操作

加入一个远程存在的子模块

git submodule add <submodule_url>

此时会新增.gitmodulessubmodule名称两个新增内容。

把现有部分代码搞成子模块并加入
首先创建一个空的repo,拉下来,把代码拷到repo下,提交,形成在remote端存在的子模块
再添加

下拉一个带有子模块的repo

git clone https://github.com/username/repo.git --recurse-submodules

如果不加后面两个,下拉时是不拉子模块的,需要执行以下:

git submodule init
git submodule update


子模块的更新

对于子模块而言,并不需要知道引用自己的主项目的存在。对于自身来讲,子模块就是一个完整的 Git 仓库,按照正常的 Git 代码管理规范操作即可。

对于主项目而言,子模块的内容发生变动时,通常有三种情况:

1)当前项目下子模块文件夹内的内容发生了未跟踪的内容变动;(即我在子模块路径下修改了代码,但没有提交)
2)当前项目下子模块文件夹内的内容发生了版本变化;(即我在子模块路径下修改了代码并提交了,主项目检测出了版本变化)
3)当前项目下子模块文件夹内的内容没变,远程有更新;(其他人修改了子模块并上传到了remote,主项目下没有修改)


注意右侧提示untracked content对应 1),new commits对应 2)

如何提交子模块的更新

对于 1),进入子模块,正常走git提交程序即可,此时子模块的remote端也会更新。但不会修改主程序下对应的子模块的commit版本号。此时主程序是状态 2)

对于2),在主程项目程序中进行add/commit/push即可,

# in father module cd
git add <submodule-name>
git commit -m "Update submodule"
git push

此后,对应子模块后面的@xxx提交编号会变化成最新的。

对于3),无法使用update --init方法进行更新。直接摘抄如下:

之前曾经提到,主项目可以使用 git submodule update 更新子模块的代码,但那是指当前主项目文件夹下的子模块目录内容与当前主项目记录的子模块版本不一致时,会参考后者进行更新。但如今这种情况下,后者当前主项目记录的子模块版本还没有变化,在主项目看来当前情况一切正常。此时,需要让主项目主动进入子模块拉取新版代码,进行升级操作。

此时需要进入子模块执行正常的pull/fetch等相关操作。

遇到的问题

一开始没搞懂逻辑关系,在子模块更新代码后,直接在父项目路径下执行了update,又把子模块(本地)的切到了之前的版本,并造成了HEAD的detach。具体什么细节记不清了,但还需要重新创建一个tmp分支merge进来。还好不会对远程造成影响。

Guess you like

Origin blog.csdn.net/tfb760/article/details/120441114