无法将文件添加到 Git 存储库

Had*_*ssa 3 git

当我尝试将所有文​​件添加到 gitRepo 时,它说:

$ git add .
error: 'ConnectorApp/' does not have a commit checked out
fatal: adding files failed
Run Code Online (Sandbox Code Playgroud)

当我尝试删除空文件夹时,它说:

$ git rm ConnectorApp/
fatal: pathspec 'ConnectorApp/' did not match any files
Run Code Online (Sandbox Code Playgroud)

是否有其他解决方案可以清除此空文件夹以将文件添加到我的 gitRepo?

tor*_*rek 6

它不是一个空文件夹。它是一个子模块

空文件夹是无关紧要的,因为 Git 只存储文件,而不是文件夹。文件的路径名可能类似于dir/file.ext. 这不是一个dir包含的文件夹file.ext,而只是一个名为dir/file.ext. 如果您的操作系统坚持这样的文件存储为一个文件夹,dir其中包含一个file.ext在您需要处理/使用它时命名的文件,那么,没关系:Git 将创建一个新的空dir文件夹,并file.ext在必要时向其中写入一个命名的文件,git checkout例如。但是 Git 只是简单地存储了文件dir/file.ext。它没有存储dir

但在这种情况下,如果您更仔细地查看ConnectorApp/,包括查找通常隐藏的文件和目录/文件夹,您将看到有一个ConnectorApp/.git. 换句话说,ConnectorApp/它本身就是它自己的 Git 存储库。Git 存储库不能包含另一个 Git 存储库,1因此,您在此处的 Git 存储库会将第二个 Git 存储库记录为 Git 在内部调用的gitlink

gitlink 背后的机制是你的 Git 可以在你自己的机器上调用第二个子 Git,进入子存储库——Git 称之为子模块——并询问它:这个存储库使用哪个提交? 如果有答案,答案将是原始提交哈希 ID。

外部存储库——Git称之为超级项目——然后在每次提交中记录这个原始哈希 ID。运行git add ConnectorAppgit add ConnectorApp/2告诉您的超级项目 Git 进入子模块的时间足够长,以找出正确的哈希 ID 并将其存储/更新为 gitlink 条目。

错误消息告诉你,子模块——另一个 Git——没有任何提交检出。所以超级项目 Git 调用子模块 Git 并询问它你检查了哪个提交?子模块 Git 说把____从这里拿走,我没有!

要解决此问题,您有多种选择:

  1. 不要使用子模块。根本不要尝试添加ConnectorApp/。让你的超级项目是一个没有子模块的 Git,并在超级项目中列出ConnectorApp/.gitignore这样它就不会尝试添加它。

    此选项仅在超级项目尚未ConnectorApp作为子模块列出时才有效。

  2. 自己进入子模块,然后选择一个提交。那是:

    cd ConnectorApp/
    git checkout <something>
    cd ..                      # return to superproject
    
    Run Code Online (Sandbox Code Playgroud)

    您在something此处填写的内容决定了当超级项目 Git 询问子模块 Git您检出哪个提交哈希 ID 时,超级项目 Git 将看到哪个提交哈希 ID?

    这就是您的超级项目提交如何记录要在子模块中使用的正确提交。

  3. 如果你的超级项目 Git 有一个现有的记录正确提交,你可以让超级项目 Git 告诉子模块 Git 检查记录的提交:

    git submodule update --checkout
    
    Run Code Online (Sandbox Code Playgroud)

    (实际上--checkout是默认的,所以你通常可以省略它,但有配置项可以改变它)。

    请注意,这适用于超级项目中列出的每个子模块。如果只有一个子模块,那没关系。

(请注意,您可能创建了不正确的子模块,其中超级项目有一个 gitlink,而没有其他所需的信息。这里可能不是这种情况,但有时确实会发生。如果发生了,请搜索 StackOverflow 以获取有关答案。 )


1一个存储库不能包含另一个批发存储库没有技术原因,但出于管理原因不这样做,所以 Git 被编程为不这样做。

2在过去的坏日子里,git add ConnectorApp/将继续将子模块中的所有文件添加到超级项目中。此行为现​​在已修复,这使得子模块比以前更容易使用。但是,如果您有一个旧的 Git,请小心:不要让尾部的斜杠出现在那里!我在这里仍然有一些来自 Git 1.5 或 1.6 天的烧伤疤痕。