2

我有一个带有 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/仅跟踪直接内部的更改或对子模块的更改。这是为什么?

在我看来,gitfoo/test就像一个子模块一样对待,但它肯定不是。

.gitignore 看起来像这样:

.idea/

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

.gitmodules 看起来像这样:

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

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

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

4

2 回答 2

1

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

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

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

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

我想唯一的问题是我怎么可能错误地弄乱了“旧/错误”回购的git配置......

于 2017-04-20T10:58:08.930 回答
1

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

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

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

于 2017-04-20T10:23:10.590 回答