有没有一种方法可以在不克隆的情况下添加一个git子模块仓库?

31
我有一份非常长的仓库清单,我想通过把它们都变成子模块来创造一个父仓库。我尝试手动添加到.gitmodules.git/config,但似乎不起作用。我也尝试过运行git submodule syncgit submodule update --init等命令,但没有成功。是否有一种方法可以欺骗Git认为我的项目拥有所有(约30K)子模块,而无需实际克隆它们全部?

欺骗Git没有太多意义。如果你只想要一个仓库列表,那么一个文本文件就可以了。或者一个构建系统。子模块的重点在于你说这个仓库是必需的,因此它被克隆。理论上,你可以使用--depth 1进行克隆,但它只能工作一次,并且只有当所有子模块连接到这些仓库的HEAD时才能工作。然后任何更改都可能导致问题。这并没有太多意义。你能更好地描述你的情况和你想要实现什么吗?可能有不同的解决方案。 - Sukima
为什么不将您的约30K个存储库放在像Gitolite或GitHub这样的Git服务器上。拥有一个主存储库似乎是错误问题的错误解决方案。 - Sukima
看看这个问题:https://dev59.com/uFsX5IYBdhLWcg3wLM3K#34266198 “本地方法”的唯一问题是.gitmodules中的URL。如果你只是使用本地子模块引用,那么在克隆存储库时可能会遇到问题。 - user3159253
但从技术上讲,这是可行的,而且看起来也不会太麻烦。 - user3159253
顺便说一句,拥有约30K个子模块似乎有点奇怪。您确定您的最终目标需要这么多吗? - user3159253
2个回答

32

在浏览互联网长途跋涉后,我发现可以通过直接在git索引中编写并创建“gitlink”文件类型来实现您想要的目标。

git update-index [--add] --cacheinfo 160000 <subrepo commit hash> <submod path>

不要忘记在.gitmodules中编写子模块(声明外部路径,通常为此)。


我尝试了你的解决方案。我运行了代码 git update-index --add --cacheinfo 160000 46a17436b495636b11492624c46d0fcf8db63458 git@ramwin.com:~/submodule.git,但是出现了错误,显示 error: Invalid path 'git@ramwin.com:~/submodule.git' fatal: git update-index: --cacheinfo cannot add git@ramwin.com:~/submodule.git。我该如何解决? - ramwin
我确定 git@ramwin.com:~/submodule.git 是活动的,因为命令 git clone git@ramwin.com:~/submodule.git 运行良好。 - ramwin
如果我运行 git update-index --add --cacheinfo 160000 d020b3a97f131ad11fb15bd8cce1774b0eb54c7b small,它就能正常工作。非常感谢。 - ramwin
这也适用于将现有的子模块更新到不同的版本。 - Jan Wilamowski

-4
有没有办法欺骗git,让它认为我的项目有所有的(约30K)子模块,而不需要实际上克隆它们?
??? ~30K 子模块?你是想克隆所有的Github存储库吗?
在一个单一的项目中拥有这么多的子模块是没有意义的。
有没有办法欺骗git,让它认为我的项目已经包含了所有内容?
不,这就是子模块的作用,用于包含第三方依赖项(也可以是您自己的),并在其自己的存储库中进行管理。

enter image description here

正如您在图像中所看到的,子模块只是项目中的子项目。您要问的是是否有办法告诉git我拥有该项目,而实际上我们根本没有它。

这是不可能的。


父存储库存储对子存储库特定提交的引用,但实际上并不需要它实际拥有子存储库数据。事实上,在克隆父存储库时,默认行为是根本不从子存储库获取任何数据。 - mhsmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接