Git子模块警告“找到多个配置”

时间:2018-08-16 18:15:29

标签: git git-submodules git-worktree

今天,我开始从git收到一个新警告,该警告之前我从未见过关于子模块的信息。例如:

warning: <hash_omitted>:.gitmodules, multiple configurations found for 'submodule.foo/bar'. Skipping second one!

快速搜索似乎未返回任何相关信息。我看到警告here生成了,听起来好像与工作树有关?

此警告确切表示什么,它的解决方案是什么?

2 个答案:

答案 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 这有点夸大其词,但解决方法仍然是相同的。