今天,我开始从git收到一个新警告,该警告之前我从未见过关于子模块的信息。例如:
warning: <hash_omitted>:.gitmodules, multiple configurations found for 'submodule.foo/bar'. Skipping second one!
快速搜索似乎未返回任何相关信息。我看到警告here生成了,听起来好像与工作树有关?
此警告确切表示什么,它的解决方案是什么?
答案 0 :(得分:1)
编辑您的.gitmodules
,并确认您有[submodule "foo/bar"]
部分中的2个子模块。删除第二个。
答案 1 :(得分:0)
Git将每个子模块的配置数据存储在名为.gitmodules
的文件中。该文件与.git/config
具有相同的 layout ,但实际上与.git/config
不同。警告是告诉您.gitmodules
文件中的数据是可疑的(有关详细信息,请参见下文)。
每个提交都存储每个文件的快照,因此每个具有子模块的提交都具有(作为该提交的一部分).gitmodules
文件。 1 检查特定的提交结果在工作树中检出该.gitmodules
文件时,您可以对其进行检查并在必要时进行修改。请注意,提交后,其.gitmodules
的快照将是永久性的且只读的,因此您无法在此文件版本错误的现有提交中修复错误,但错误只是一个警告。您可以(通常应该)通过修复.gitmodules
文件并使用git add .gitmodules
在任何您提交的 new 提交中进行修复。
1 从技术上讲,这仅适用于格式正确的提交,因为提交可以存储具有 gitlink 条目但没有{{1} }文件。但是,那将是一个不同的错误。
Git的配置文件格式主要来自INI files。这是一个示例.gitmodules
:
.git/config
每个设置都为部分中包含的变量命名,并在方括号中描述。如果该部分仅是[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git://git.kernel.org/pub/scm/git/git.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
之类的一部分,则变量为[core]
,依此类推。如果该部分的第二部分类似core.filemode
,则变量为[remote "origin"]
和remote.origin.url
。
运行remote.origin.fetch
将上面的配置转换为变量及其值的列表:
git config --local --list
使用core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git://git.kernel.org/pub/scm/git/git.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
,可以以编程方式操作变量。但是请注意,至少可以通过文件格式重复一段内容:
git config
许多Git都以非常线性的方式读取这些配置文件,从系统范围的文件($ cat foo.conf
[core]
foo = bar
[dave]
hal = ibm
[core]
podbaydoors = closed
$ git config -f foo.conf -l
core.foo=bar
dave.hal=ibm
core.podbaydoors=closed
或其他特定于系统的位置)开始,然后是每个用户的文件(/etc/git/config
或类似),然后是本地存储库的配置($HOME/.gitconfig
)。如果您一次或多次设置相同的变量,可能是通过在几个配置文件中重复一个节,则通常使用 last 设置:
.git/config
您的用户名和电子邮件地址将为[user]
name = A
name = B
email = wrong@example.com
email = wright@example.com
,因为后面的设置将覆盖前面的设置。
但是,某些变量会累积。例如,每个遥控器的B <wright@example.com>
设置都是以这种方式工作的。如果您输入:
fetch
在您的[remote "origin"]
fetch = +refs/notes/*:refs/notes/*
中,并且您的每个存储库$HOME/.gitconfig
已将.git/config
设置为通常的remote.origin.fetch
,您的+refs/heads/*:refs/remotes/origin/*
将强制更新您自己的所有记录参考文献和您常用的远程跟踪参考文献。 (顺便说一句,这样做通常是不明智的。如果您正在使用它们,这可能会使您的笔记破烂。这只是您 可以做的事情的一个例子。如果要执行此操作,请使用特殊的远程名称!)
但是,当子模块代码在工作时,它会寻找 first:
git fetch
部分并读取这些变量。如果有一个秒:
[submodule "path"]
部分,它忽略那些设置。 2 确保第二个没有被用于任何东西。如果没有,请将其删除。如果某些设置应适用,请将其移至第一部分。
(散列ID之所以出现,是因为可以告诉[submodule "path"]
直接从提交或树中读取git config
,并且子模块代码可以这样做,因为在结帐完成之前需要模块设置。)
2 这有点夸大其词,但解决方法仍然是相同的。