如何解决Git子模块是独立的存储库吗?
当我查看Git存储库时,可以看到主存储库中有一个.git文件夹。然后,当我进入子模块时,可以看到没有名为.git的文件夹,但是有一个名为.git的文件。为什么会有这种差异?
如果子模块是与主存储库类似的实际存储库,并且可以在基本上独立于主存储库的基础上进行工作,则不应该都具有.git文件夹还是都具有.git文件并且不能像这样有所不同?
解决方法
子模块的git存储目录存储在主存储库的.git/
目录中。
您可以在.git/modules/
下找到它们:
ls .git/modules
,
是的,每个子模块都是其自己的独立存储库。
在git submodule
的早期就有一段时期:超级项目和每个子模块都有自己的.git
文件夹。后来决定将所有git
相关文件都存储在一个.git
目录下,即使对于子模块也是如此。因此git submodule
增长了一个子命令git submodule absorbgitdirs,该子命令将子模块的.git
目录移到超级项目的.git/modules/
上,并留下指向超级项目的{{1} }。
.git
自动执行此操作(移至超级项目的.git/modules/
)。
是的,每个Git子模块都是一个独立的存储库。您所看到的称为gitlink,它是使.git
内容指向其他位置的一种方式。最初的想法是为此使用符号链接,但是Windows需要提升的特权或特殊设置才能使用符号链接,因此Git必须改为使用gitlinks。
要对子模块使用gitlinks的原因是因为它可以更轻松地取消初始化子模块(即摆脱其内容),而不会浪费其历史记录。如果您有gitlink,则只要子模块的工作树是干净的,对其进行初始化实际上就只是目录上的rm -fr
,这非常方便。而且,由于人们有时使用子模块来做到这一点,因此这意味着他们并没有意外地放弃自己的历史。
如果需要,仍然可以使用单独的.git
目录,但是通常没有充分的理由这样做,除非出于某种原因您的子模块位于单独的挂载点上。
如果要查找存储库的实际Git目录,请执行以下操作:git rev-parse --git-dir
或git rev-parse --absolute-git-dir
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。