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 init
和 git submodule update
命令知道要检出到哪个点的方式。
任何其他不是子模块的文件夹(因此不包含 .git
文件夹)被视为父存储库的一部分,在本例中为 foo。您不必告诉 git foo/test
是主存储库的一部分,它知道它已经是。
我刚发现问题。我不知道为什么,但我的 git-config 搞砸了。
做一个简单的 git config --list
(在 foo/
内部)表明 core.worktree
是错误的:
core.worktree=../../../bar1
我不记得手动更改配置。我刚刚克隆了我的存储库的新副本,更新了子模块并将我的新更改 foo/test/
复制到新克隆的存储库中。现在一切正常。
我想唯一的问题是我怎么会错误地弄乱 "old/bugged" 存储库的 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
视为子模块,但它肯定不是。
.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 init
和 git submodule update
命令知道要检出到哪个点的方式。
任何其他不是子模块的文件夹(因此不包含 .git
文件夹)被视为父存储库的一部分,在本例中为 foo。您不必告诉 git foo/test
是主存储库的一部分,它知道它已经是。
我刚发现问题。我不知道为什么,但我的 git-config 搞砸了。
做一个简单的 git config --list
(在 foo/
内部)表明 core.worktree
是错误的:
core.worktree=../../../bar1
我不记得手动更改配置。我刚刚克隆了我的存储库的新副本,更新了子模块并将我的新更改 foo/test/
复制到新克隆的存储库中。现在一切正常。
我想唯一的问题是我怎么会错误地弄乱 "old/bugged" 存储库的 git 配置...