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

时间:2019-11-20 17:18:14

标签: git

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

$ git add .
error: 'ConnectorApp/' does not have a commit checked out
fatal: adding files failed

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

$ git rm ConnectorApp/
fatal: pathspec 'ConnectorApp/' did not match any files

还有其他解决方法可以清除此空文件夹,以将文件添加到gitRepo中?

1 个答案:

答案 0 :(得分:3)

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

空文件夹将是无关紧要的,因为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称为 superproject )然后在每次提交中记录此原始哈希ID。运行git add ConnectorAppgit add ConnectorApp/ 2 会告诉您的超级项目Git输入子模块足够长的时间,以找到正确的哈希ID并将其存储/更新为gitlink条目。 / p>

该错误消息告诉您,子模块-其他Git-没有签出任何提交。因此,超级项目Git调用子模块Git并询问它您已签出哪个提交?,子模块Git说将____从这里取出,我什么都没有!

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

  1. 不使用子模块。完全不要尝试添加ConnectorApp/。让您的超级项目成为不带子模块的Git,并在超级项目的ConnectorApp/中列出.gitignore,以便不要尝试添加它。

    仅当超级项目尚未将ConnectorApp列为子模块时,此选项才有效。

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

    cd ConnectorApp/
    git checkout <something>
    cd ..                      # return to superproject
    

    您在 something 中填写的内容确定了当超级项目Git询问子模块Git 您拥有哪个提交哈希ID时,超级项目Git将看到的提交哈希ID。签出了吗?

    这是您的超级项目提交可以记录要在子模块中使用的正确提交的方式。

  3. 如果您的超级项目Git有一个已记录的正确提交,则可以让超级项目Git告诉子模块Git签出记录的提交:

    git submodule update --checkout
    

    (实际上是默认的--checkout,因此您通常可以忽略它,但是有些配置项可以更改此设置)。

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

(请注意,您可能创建了不正确的子模块,其中超级项目具有gitlink ,而其余所有必需的信息都没有。这里可能不是这种情况,但有时确实会发生这种情况。已经发生,请在StackOverflow上搜索有关此问题的答案。)


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

2 在糟糕的过去,git add ConnectorApp/会继续并将子模块中的所有文件添加到超级项目中。现在,此行为已修复,这使子模块比以前更容易使用。但是,如果您有旧的Git,请当心:不要让斜线出现在其中!在这里,我仍然有1.5或1.6天的Git灼伤痕迹。