【问题标题】:Not able to add files to Git repository无法将文件添加到 Git 存储库
【发布时间】:2019-11-20 17:18:14
【问题描述】:

当我尝试将所有文​​件添加到 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 吗?

【问题讨论】:

标签: git


【解决方案1】:

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

空文件夹无关紧要,因为 Git 只存储 文件,而不存储文件夹。文件的路径名可能类似于dir/file.ext。这不是包含file.ext 的文件夹dir,而是一个名称为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 条目。

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

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

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

    此选项仅在超级项目已经ConnectorApp列为子模块时才有效。

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

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

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

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

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

    git submodule update --checkout
    

    (其实--checkout是默认的,一般可以省略,但是有配置项可以改变)。

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

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


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

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

【讨论】:

  • 这对我有用: 我删除了子模块的文件夹并删除了.gitmodules 中的子模块声明。在此之后,我能够添加、提交和推送。最后,我再次:git submodule add &lt;github_repository_url.git&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2012-09-23
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
相关资源
最近更新 更多