带有子模块的 Git 存储库不跟踪本地更改?



我有一个包含 3 个子模块的 git 存储库,如下所示:

foo/  # main repository
bar1/  # submodule1
bar2/  # submodule2
bar3/  # submodule3

我在主存储库中执行git init后直接添加了子模块:

git submodule add https://github.com/bar1.git bar1
...

现在奇怪的是,如果我添加一个新目录,例如foo/test/git 不会跟踪foo/test/内部的更改。只需跟踪foo/内部的更改或对子模块的更改。为什么?

在我看来,git 将foo/test视为子模块,而事实并非如此。

.gitignore 看起来像这样:

.idea/

。基本上只忽略隐藏的IDE项目相关目录。

.gitmodules 看起来像这样:

[submodule "bar1"]
path = bar1
url = https://github.com/...

[子模块"栏 2"] 路径 = 柱线 2 网址 = https://github.com/... [子模块"栏 3"] 路径 = 柱线3 网址 = https://github.com/...

我是否必须手动告诉 gitfoo/test/应该保留在主存储库中并且它不是子模块?

在 foo 文件夹中,您将有一个.git文件夹,这是 foo 的 git 存储库。 对于子模块,当您执行git submodule add bar1时,它会在签出时在 bar1 中创建一个.git文件夹。

当您在 foo 中提交更改(包括子模块)时,git 知道(我不知道如何解释如何工作)bar1 中有一个.git文件夹,因此它是它自己的存储库。 如果它在.gitmodules文件中注册为子模块,那么它将获取子模块的最新哈希值,并提交该哈希值来代替文件夹(您将能够在 Github 或您使用的任何管理器中看到它,如果您单击该文件夹,它将加载带有哈希的文件)。 这就是git submodule initgit submodule update命令知道要签出到哪个点的方式。

任何其他不是子模块的文件夹(因此其中不包含.git文件夹)它被视为父存储库的一部分,在本例中为 foo。 你不必告诉 gitfoo/test是主仓库的一部分,它知道它已经是了。

我刚刚发现了问题。我不知道为什么,但我的 git 配置搞砸了。

做一个简单的git config --list(foo/内部)揭示core.worktree是错误的:

core.worktree=../../../bar1

我不记得手动更改了配置。我刚刚克隆了存储库的新副本,更新了子模块,并将foo/test/的新更改复制到新克隆的存储库中。现在一切正常。

我想唯一的问题是我怎么会错误地搞砸"旧/有错误"存储库的 git 配置......

相关内容

  • 没有找到相关文章

最新更新