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