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


87

我无意中将超过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,当我的项目中没有太多垃圾照片时,我可能会稍等片刻。但是从那以后,我投入了很多次,并对代码进行了很多更改。

Answers:


86

在您的情况下,请使用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
    

检查这个这个这个进一步的帮助。为了安全起见,我建议您在继续执行这些说明之前,在系统上创建存储库的备份副本。

至于您的原始错误消息,是因为您已经使用git rm取消了对它们的跟踪,因此git抱怨了,因为它无法删除未跟踪的文件。在此处阅读有关此内容的更多信息


2
嘿,我遇到了同样的问题,但是在步骤1键入命令时,出现了一个错误:致命:不良修订'--prune-empty'。有什么线索吗?
凯文

@kevin抱歉,错过了此评论。您可以在没有该标志的情况下运行它。修剪将删除任何空的提交对象。
mu无

1
这条线不应该git add .gitignore && commit -m "ignore rule for photos"git add .gitignore && git commit -m "ignore rule for photos"
2015年

@克隆是的,应该是的,现在已经纠正了:)
mu无

1
这是一个了不起的答案。修复了我多年来与回购交易有关的问题。谢谢!
Moshe

18

一个非常简单的答案是。

步骤1:

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

使用git add .git add <filename>

第2步:

然后轻松地删除它们使用命令git rm -f <filename>这里RM =捞出-f = forcely。


这不会执行OP想要的操作,即删除先前提交中存在的文件。您需要使用git filter-branch其他地方提到的方法。
西蒙·史蒂文斯

9

步骤1

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

第2步

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

第三步

git push -f origin branch

非常感谢@mu。


7
...我一直认为git比它要难得多,这证明了这一点。任何人都无法记住大多数git命令的存在,更不用说他们的标志和怪癖了。Git模型是有道理的,它可以一直工作到遵循简单流程为止,一旦卡住,就会变得很困难。
穆罕默德·乌默尔

2
这是对我--ignore-unmatch
有用


1

在我的情况下,此链条有效:

  1. git rm -r WebApplication/packages

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

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

做了工作,它恢复了我使用rm代替删除的文件git rm

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


0

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

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

然后,您需要将其添加到自己的目录中,.gitignore这样就不会再对其进行跟踪了。


-1

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


抱歉! 我一定是看错了问题。我认为这就是目标
ccsinsf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.