【问题标题】:git rm - fatal: pathspec did not match any filesgit rm - 致命:pathspec 不匹配任何文件
【发布时间】:2014-08-23 04:00:32
【问题描述】:

我不小心在我的项目文件夹中添加了 9000 多张照片。并承诺他们。然后从磁盘中删除它们。坚定的。

现在我尝试将更改推送到 git 服务器。但它花费的时间太长,并试图发送 12 Gb 的数据。

我检查了磁盘上的文件大小,发现.git 文件夹确实占用了 12 Gb。

如何从那里删除照片?我试过git rm,但失败了:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

因为我已经从磁盘中删除了它们,但它们仍在.git 文件夹中。

我尝试将public/photos 添加到.gitignore

public/photos/
*.zip

但没有结果。 当然我可以hard reset head 到我的项目中没有那么多垃圾照片的那一刻。但是从那时起,我多次提交并在代码中进行了很多更改。

【问题讨论】:

    标签: git git-filter-branch


    【解决方案1】:

    在您的情况下,请使用 git filter-branch 而不是 git rm

    git rm 将删除文件,因为它们将不再被 git 跟踪,但这不会删除与这些图像对应的旧提交对象,因此您仍然会被推送较早的提交对应12GB的图片。

    另一方面,git filter-branch 也可以从所有先前的提交中删除这些文件,从而无需推送其中任何一个。

    1. 使用命令

      git filter-branch --force --index-filter \
        'git rm -r --cached --ignore-unmatch public/photos' \
        --prune-empty --tag-name-filter cat -- --all
      
    2. 过滤器分支完成后,确认没有意外文件丢失。

    3. 现在添加一个 .gitignore 规则

      echo public/photos >> .gitignore
      git add .gitignore && git commit -m "ignore rule for photos"
      
    4. 现在做一个推送

      git push -f origin branch
      

    请查看thisthisthis 以获得更多帮助。为了安全起见,我建议您在继续执行这些说明之前在系统上创建存储库的备份副本。

    至于您的原始错误消息,这是因为您已经使用 git rm 取消跟踪它们,因此 git 抱怨,因为它无法删除它没有跟踪的文件。阅读more about this here

    【讨论】:

    • 嘿,我遇到了同样的问题,但是在第 1 步输入命令时,我收到一个错误:致命:错误修订版 '--prune-empty'。有什么线索吗?
    • @kevin 抱歉,错过了这条评论。您可以在没有该标志的情况下运行它。修剪会删除任何空的提交对象。
    • 这行git add .gitignore && commit -m "ignore rule for photos"不应该是git add .gitignore && git commit -m "ignore rule for photos"
    • 在 Windows 上,我在资源管理器窗口中右键单击源目录,选择“在此处使用 git bash”并运行命令。 git cmd-windows 对我不起作用,它必须是 git bash。
    • 这是一个非常棒的答案。修复了我多年来一直在使用我的 repo 的问题。谢谢!
    【解决方案2】:

    一个非常简单的答案是。

    第 1 步:

    首先添加要删除的未跟踪文件:

    使用git add .git add <filename>

    第 2 步:

    然后在此处使用命令git rm -f <filename> rm=remove 和 -f=forcely 轻松删除它们。

    【讨论】:

    • 这不会做 OP 想要的,即删除以前提交中存在的文件。您需要使用git filter-branch,如其他地方所述。
    【解决方案3】:

    第 1 步

    将文件名添加到您的 .gitignore 文件中。

    第 2 步

    git filter-branch --force --index-filter \
        'git rm -r --cached --ignore-unmatch YOURFILE' \
        --prune-empty --tag-name-filter cat -- --all
    

    第 3 步

    git push -f origin branch
    

    非常感谢@mu。

    【讨论】:

    • ...我一直认为 git 比它应该的要难,这证明了这一点。任何人都无法记住大多数 git 命令的存在,更不用说它们的标志和怪癖了。 Git 模型是有道理的,它一直有效,直到你遵循简单的流程,一旦你卡住,你就会卡住。
    • 这是适合我的解决方案,我需要--ignore-unmatch
    【解决方案4】:

    使用它对我有用

    git rm -f --cached <filename>
    

    【讨论】:

      【解决方案5】:

      要从 git 中删除跟踪和旧提交的文件,您可以使用以下命令。就我而言,我想从dist 目录中取消跟踪并删除所有文件。

      git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all
      

      然后,您需要将其添加到您的.gitignore,这样就不会被进一步跟踪。

      【讨论】:

      • 让我开心,谢谢!
      【解决方案6】:

      有时当您不跟踪文件时会发生这种情况,使用git add untracked file name 添加文件,然后只需执行git rm -r file name

      【讨论】:

        【解决方案7】:
        git stash 
        

        完成了任务, 它恢复了我使用rm 而不是git rm 删除的文件。

        我首先检查了最后一个哈希值,但我认为这不是必需的。

        【讨论】:

          【解决方案8】:

          这条链在我的情况下有效:

          1. git rm -r WebApplication/packages

          有一个确认 git-dialog。您应该选择“y”选项。

          1. git commit -m "blabla"
          2. git push -f origin &lt;ur_branch&gt;

          【讨论】:

            【解决方案9】:

            仅供参考,我注意到我有一些权限为 000 的文件,也许它们是用 sudo 创建的,我不知道,但是在将您的权限更改为 644 后(我需要 sudo 进行此操作),问题是解决了

            sudo chmod 644 vendor/symfony/yaml
            

            以及提交结果:

            diff --git a/vendor/symfony/yaml b/vendor/symfony/yaml
            deleted file mode 160000
            index 212a27b7..00000000
            --- a/vendor/symfony/yaml
            +++ /dev/null
            @@ -1 +0,0 @@
            -Subproject commit 212a27b731e5bfb735679d1ffaac82bd6a1dc996
            diff --git a/vendor/symfony/yaml b/vendor/symfony/yaml
            new file mode 100644
            index 00000000..20a0b9d0
            --- /dev/null
            +++ b/vendor/symfony/yaml
            @@ -0,0 +1 @@
            +Subproject commit 212a27b731e5bfb735679d1ffaac82bd6a1dc996
            

            【讨论】:

              【解决方案10】:

              我有一个重复的目录 (~web/web),当我在第一个 web 文件夹中运行 rm -rf web 时,它删除了嵌套的重复。

              【讨论】:

              • 对不起!我一定是误读了这个问题。我以为这就是目标
              猜你喜欢
              • 2013-12-09
              • 2019-03-04
              • 2011-03-17
              • 2012-09-15
              • 1970-01-01
              • 2012-11-29
              • 1970-01-01
              • 2013-06-01
              • 1970-01-01
              相关资源
              最近更新 更多