当一个Git子模块所引用的仓库被删除时会发生什么?

4

假设我在 GitHub 上发现一个有趣的代码仓库并想要使用它,我将其作为子模块添加,那么如果该代码仓库的所有者决定删除该仓库,我的子模块会变成无效吗?


2
简化jthill的回答:是的,它们确实会变得损坏,但可以很容易地修复。 :-) - torek
1个回答

6

您已经获取到的历史记录,可以使用子模块更新或抓取等方式进行操作。您仍然可以从任何拥有这些历史记录的存储库中获取它们,并将其推送到任何地方,重要的是历史记录,而不是任何人保留这些历史记录的存储库。 .gitmodules 文件只是关于如何找到它们的注释;当上游删除其存储库时,这些注释就过时了,但这就是为什么 git submodule initgit submodule update 是单独的命令:init 从 .gitmodules 的注释中加载您的存储库配置,然后您可以随意更改它们。


如果我没有本地缓存库怎么办?我能拉取子模块吗? - off99555
1
如果您曾经更新过子模块,那么您已经拥有了所需的所有历史记录。git submodule update 会为您克隆和/或获取(然后检出或者使用您从 .gitmodules 配置的默认值)。当您 git add 子模块提交时,Git 会在您提交的树中记录提交 ID。Git 实际上并不关心该提交来自何处,事实上 git submodule 是一个辅助命令,它可以帮助您获取您的历史记录中要检出的提交。这就是它的全部作用。 - jthill
我的意思是,如果我没有任何存储库的本地克隆。我克隆了我的存储库,其中包含一个子模块。如果我调用 git submodule update,那么我是否会从被删除之前的阶段获取所有已删除存储库的文件? - off99555
如果 .gitmodules 中的 URL 不再托管该仓库,则无法这样做。如果您可以找到所需提交的替代来源,可以更新配置以指向仍然(或现在)有效的 URL 或路径,然后再次尝试。许多子模块的内容实际上并不是可选的,我已经开始在主仓库中携带非可选子模块历史记录。助手命令对此并没有真正的自动化,但设置很容易,使用 git submodule init 和 git worktree add 即可。 - jthill
好的。所以如果我使用一个不太出名的存储库,那么将其用作子模块是不安全的,因为如果它被删除了,我就找不到其他人的副本来指向了。你认为我们应该为不太出名的存储库创建一个分支吗? - off99555
那样做没问题。你如何获取所需的提交对于Git(或工作)来说并不重要,只要你能获取它们即可。 - jthill

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