git rm-致命:pathspec与任何文件都不匹配

git rm-致命:pathspec与任何文件都不匹配,git,git-filter-branch,Git,Git Filter Branch,我意外地将9000多张照片添加到我的项目文件夹中。并将其付诸实施。然后从磁盘上删除它们。承诺 现在我尝试将更改推送到git服务器。但是它花费的时间太长,并且试图发送12GB的数据 我检查了磁盘上的文件大小,发现实际上.git文件夹需要12GB 如何从那里删除照片?我尝试了git rm,但失败: ❯ git rm public/photos fatal: pathspec 'public/photos' did not match any files 因为我已经从磁盘上删除了它们,但它们仍然在.

我意外地将9000多张照片添加到我的项目文件夹中。并将其付诸实施。然后从磁盘上删除它们。承诺

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

我检查了磁盘上的文件大小,发现实际上
.git
文件夹需要12GB

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

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files
因为我已经从磁盘上删除了它们,但它们仍然在
.git
文件夹中

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

public/photos/
*.zip
但没有结果。 当然,我可以
硬重设头部
到我的项目中没有这么多垃圾照片的时刻。但从那时起,我承诺了很多次,并在代码上做了很多更改

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

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

另一方面,
git filter分支
,也可以从以前的所有提交中删除这些文件,这样就不需要推送它们中的任何一个

  • 使用命令

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  • 筛选器分支完成后,请确认未丢失任何意外文件

  • 现在添加一个.gitignore规则

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  • 现在推一下

    git push -f origin branch
    
  • 检查,并获得进一步帮助。为了安全起见,我建议您在继续执行这些说明之前,在系统上创建回购协议的备份副本


    至于您的原始错误消息,发生这种情况是因为您已经使用
    git-rm
    取消了对它们的跟踪,因此git会抱怨,因为它无法删除它没有跟踪的文件。阅读。

    步骤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。

    一个非常简单的答案是

    第1步:

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

    使用
    git-add.
    git-add

    第二步:

    然后使用命令
    git rm-f
    hererm=删除和-f=强制删除它们

    git stash 
    
    完成了任务, 它还原了我用
    rm
    而不是
    git-rm
    删除的文件


    我首先签出了最后一个哈希,但我认为这不是必需的

    在我的情况下,此链起作用:

  • git-rm-r web应用程序/包
  • 有一个确认git对话框。您应该选择“y”选项

  • git提交-m“blabla”
  • git推送-f原点

  • 要从git中删除跟踪的和旧提交的文件,可以使用下面的命令。在这里,我想取消跟踪并从
    dist
    目录中删除所有文件

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

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

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

    使用它对我很有效

    git rm -f --cached <filename>
    
    git rm-f——缓存
    
    仅供参考,我注意到我有一些权限为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
    

    嘿,我也遇到了同样的问题,但是当在步骤1中键入命令时,我得到了一个错误:致命:错误修订'--prune empty'。有什么线索吗?@kevin抱歉,错过了这个评论。您可以在没有该标志的情况下运行它。剪枝会删除任何空的提交对象。这行不是应该是吗
    git add.gitignore&&commit-m“忽略照片规则”
    be
    git add.gitignore&&git commit-m“忽略照片规则”
    @Clone是的,应该是这样,现在已经更正了:)这是一个非常棒的答案。修正了我的回购协议几年来一直存在的一个问题。谢谢我一直认为git比它应该的更难这证明了这一点。任何人都不可能记住大多数git命令的存在,更不用说它们的标志和特性了。Git模型是有意义的,它会一直工作到你遵循简单的流程,一旦你陷入困境,你就会陷入困境。这是我的解决方案,我需要<代码>--忽略不匹配,这不会满足OP的要求,也就是删除以前提交中存在的文件。您需要使用别处提到的
    git filter branch
    。对不起!我一定是看错了这个问题。我以为那就是目标