git 个没有 .git 个模块文件的子模块?

git submodules without .gitmodules file?

切换分支(使用 SourceTree),我收到类似

的错误消息
fatal: No url found for submodule path '...' in .gitmodules

整个项目中没有.gitmodules个文件

我应该看哪里?

SourceTree 在分支切换时命中以下命令:

git --no-optional-locks -c core.quotepath=false submodule update --init 

当我输入git submodules时,输出是:

# git submodule                        
fatal: no submodule mapping found in .gitmodules for path '...'

文件夹 ... 为空。

你这里有一个损坏的子模块。 (或者半个子模块?一个没有指令的子模块?不清楚 调用 什么——除了 ,我们可以说 gitlink 的一半是 "gitlink",这至少是一个可搜索的行话。)

Git 中的一个子模块是对 另一个 Git 存储库 的引用。为了使用 子模块,您必须已经有另一个Git 存储库。通常,要制作 一个Git 存储库,我们主要使用git clone 来复制其他一些现有的存​​储库。所以通常情况下,一个子模块会携带 Git 为 运行 git clone 所需要的必要指令。这些说明进入 .gitmodules 文件。

如果.gitmodules文件缺失,如本例,则表示缺少设置子模块的说明。由您决定是通过添加说明来修复它,还是通过从您的下一次提交中删除格式错误的子模块来修复它。

移除半成型的子模块更容易。请参阅 VonC's accepted answer to No submodule mapping found in .gitmodule for a path that's not a submodule,但您所要做的就是使用 git rm,然后提交。这个新提交将不再引用由于缺少克隆指令而无法克隆的子模块。随后的新提交,从这个没有提到子模块的提交构建,也不会提到子模块(它仍然不存在)。

请注意,所有现有提交都已损坏。您唯一可以做的就是 删除 (或替换)任何现有的损坏提交,因为无法修改现有的提交。尝试修复或删除现有提交通常不是一个好主意,因为其他人可能依赖于它们。如果您将另一个 Git 存储库克隆到位,那么像这样 的半子模块/损坏的子模块可以 作为常规(未损坏的)子模块使用。

要通过修复子模块来解决问题,请将适当的配置放入新的 .gitmodules 文件以及 git addgit commit.gitmodules 文件中。当然,实际这样做的问题是您需要知道说明是什么。从损坏的子模块中可以清楚地看到其中一些,因为 in .gitmodules 文件中的信息分为几个部分:一部分是 path, 这只是 mode-160000 git ls-files 条目的名称(再次参见 VonC 的回答)。但另一部分是应该克隆的存储库的 URL,谁知道那可能是什么?1


1从理论上讲,无论谁拥有您克隆的存储库以进入这种情况,都应该知道 - 或者,他们应该知道谁知道,或者知道谁知道谁知道,等等 但在实践中,你会得到很多 It was like that when I got here.