包含子模块的Git仓库不会跟踪本地更改?

时间:2017-04-20 10:14:55

标签: git git-submodules git-status git-track

我有一个包含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/...

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

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

2 个答案:

答案 0 :(得分:1)

在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是主存储库的一部分,它知道它已经存在。

答案 1 :(得分:0)

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

做一个简单的git config --list(在foo/内)发现core.worktree错了:

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

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

我想唯一的问题是我怎么会错误地搞砸了“旧/错误”回购的git配置......