Git认为一些复制的代码是一个子模块

5
为了解决第三方库中的问题,我将其源代码复制到自己的git repo中。我立即重现了这个问题,所以想提交一个记录起点。但是,当我尝试提交时,我复制的所有文件都没有显示在我的工作树中,因此我无法将它们暂存。我尝试显式地暂存复制源代码中的一个文件:
git add README 
fatal: Path 'Src/Foo/README' is in submodule 'Src/Foo/FooBar'

看起来Git认为它是一个子模块,即使我从未告诉它它是。我尝试删除第三方源根目录中的.git目录,但这没有帮助。然后我尝试遵循这些说明,但它告诉我没有子模块:

git submodule deinit .
No submodule mapping found in .gitmodules for path 'Src/Foo/FooBar'

有什么想法吗?

1个回答

7

最简单的解决方案是克隆第三方仓库,重现您的修复,提交并推送(如果您可以访问他们的仓库,如果您已经在GitHub上forked it

如果没有,那么在您的仓库中进行以下操作:

git ls-tree HEAD Src/Foo/FooBar

查看是否存在一个特殊条目160000, 这表明FooBar曾经在某个时点被注册为子模块,即使.gitmodules不再列出FooBar。

git rm --cached Src/Foo/FooBar(使用git 1.8.5+)将处理该子模块条目。


当然,如果第三方源不是Git仓库的一部分,则将它们添加到您自己的仓库中的不同文件夹中也可以。
但是,这些第三方库文件的历史记录将与您的主要仓库的历史记录混合在一起。

谢谢。我已经在我的存储库中修改了第三方源代码。我不想要一个次要的存储库 - 我希望所有东西都在一个地方。尝试使用git rm,但它只是从git中删除了目录。然后它允许我将目录添加回去,但不包括内容(就像以前一样)。但是,我找到了一个解决方法(请参见我的答案)。 - me--
通过将您的第三方声明为子模块,您可以将所有内容保留在一个位置,并使用@me--进行调用。 - VonC
明白了。我想现在不想增加复杂性,因为我是一个 Git 新手,并且这只是一个短期的 hack,用于第三方库,一旦它在官方发布的二进制文件中得到修复,我就会将其删除。对于 Git 专家来说,这可能看起来很愚蠢,但就是这样。 - me--

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