Git 带有子模块的 repo 不跟踪本地更改?

Git repo with submodules does not track local changes?

我有一个包含 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 视为子模块,但它肯定不是。

.git忽略看起来像这样:

.idea/

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

.git模块看起来像这样:

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

[子模块"bar2"] 路径 = bar2 url = https://github.com/... [子模块 "bar3"] 路径 = bar3 url = https://github.com/...

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

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

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

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

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

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

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

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

我想唯一的问题是我怎么会错误地弄乱 "old/bugged" 存储库的 git 配置...