我有一个包含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/
应该保留在主存储库中并且不是子模块?
答案 0 :(得分:1)
在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
是主存储库的一部分,它知道它已经存在。
答案 1 :(得分:0)
我刚刚发现了这个问题。我不知道为什么,但我的git-config搞砸了。
做一个简单的git config --list
(在foo/
内)发现core.worktree
错了:
core.worktree=../../../bar1
我不记得手动更改配置。我刚刚克隆了我的存储库的新副本,更新了子模块并将我的新更改foo/test/
复制到刚刚克隆的存储库中。现在一切正常。
我想唯一的问题是我怎么会错误地搞砸了“旧/错误”回购的git配置......