Git 在子模块中配置 "bad config file line"

Git config "bad config file line" in a submodule

我在 Windows 和 Linux 上使用 git,我最近 运行 遇到了一个仅在 [=] 上出现的 st运行ge 问题76=]... 假设我有两个项目。两者都在 git 中进行了版本控制,并且每个都有一个子模块。


项目 1

子模块配置位于 C:\Projects\project1\.git\modules\plugins\tasks\config 中,如下所示:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    worktree = ..\..\..\..\plugins\tasks
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = ssh://domain/repo/path
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

项目 2

子模块配置位于C:\Projects\project2\.git\modules\doc\preamble\config,下面我也提供:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    worktree = ../../../../doc/preamble
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = ssh://domain/another/repo/path
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

总而言之,配置文件之间唯一真正的区别是工作目录路径中的 /\


问题

我在GitBash经营。当我在 项目 1 及其子模块中执行 git status (和其他一些简单命令)时:

/c/Projects/project1 (devel) $ git status
fatal: bad config file line 6 in c:/Projects/project1/.git/modules/plugins/tasks/config
fatal: 'git status --porcelain' failed in submodule plugins/tasks

/c/Projects/project1/plugins/tasks $ git status
fatal: bad config file line 6 in d:/Projects/project1/.git/modules/plugins/tasks/config

/c/Projects/project1 (devel) $ git submodule sync -- plugins/tasks/
Synchronizing submodule url for 'plugins/tasks'
fatal: bad config file line 6 in c:/Projects/project1/.git/modules/plugins/tasks/config

此外,git submodule initupdateupdate --init没有输出,也没有改善这种情况。

而当我在 项目 2 中使用 git 时,一切正常。

您认为天真的解决方案是手动替换子模块配置中的斜线,更复杂的解决方案是编写一个脚本在所有受影响的子模块中执行此操作。

不幸的是,实际上,将第一个配置中的路径更改为:

worktree = ..\..\..\..\plugins\tasks

至:

worktree = ../../../../plugins/tasks

导致不同的错误:

/c/Projects/project1/plugins/tasks $ git status
fatal: bad object HEAD

当我查看文件 c/Projects/project1/.git/modules/plugins/tasks/refs/master 时,那里出了点问题,因为里面的 SHA1 是:

0000000000000000000000000000000000000000

此时,在我做了git reset --hard origin/master(在子模块中)后,子模块的存储库恢复到可用状态。

但是,首先哪里出了问题?

如果可以的话,我想知道为什么会出现这个问题?这与项目的原始平台有关系吗?我如何初始化子模块重要吗?我想追查问题的原因,避免以后再发生。

  1. 尽管在 Windows 中,但 git 像 UNIX 程序一样思考,因此正斜杠是正确的。有关在 Windows git.
  2. 中使用正斜杠的一些示例,请参阅 http://gitbyexample.org/
  3. 您的存储库中出现问题。我不确定是什么,但在与它战斗太多之前,你能重新克隆吗?将旧的顶级目录从 project1 重命名为 project1.fubar 并重做 git clone foo://project1 并且您的目录应该 最终正确。