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

Max*_*mov 60 git git-filter-branch

我偶然在项目文件夹中添加了9000多张照片.并承诺他们.然后从磁盘中删除它们.承诺.

现在我尝试将更改推送到git服务器.但它需要太长时间并尝试发送12 Gb的数据.

我检查了磁盘上的文件大小,看到真正的.git文件夹需要12 Gb.

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

? git rm public/photos
fatal: pathspec 'public/photos' did not match any files
Run Code Online (Sandbox Code Playgroud)

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

我试图添加public/photos.gitignore:

public/photos/
*.zip
Run Code Online (Sandbox Code Playgroud)

但没有结果.当然,我可以hard reset head在我的项目中没有这么多垃圾照片.但从那时起我多次承诺并在代码中做了很多改变.

mu *_*u 無 67

在您的情况下,使用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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 筛选器分支完成后,验证没有意外的文件丢失.

  3. 现在添加.gitignore规则

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在做推

    git push -f origin branch
    
    Run Code Online (Sandbox Code Playgroud)

检查这个,这个这个以获得进一步的帮助.为了更加安全,我建议您在继续执行这些说明之前在系统上创建repo的备份副本.

至于你的orignial错误消息,它正在发生,因为你已经没有使用它们git rm,因此git抱怨,因为它无法删除它没有跟踪的文件.在这里阅读更多相关信息.

  • 嘿,我遇到了同样的问题,但是在第 1 步输入命令时,我收到一个错误:致命:错误修订版“--prune-empty”。有什么线索吗? (2认同)
  • 这行`git add .gitignore && commit -m“忽略照片规则”`不应该是`git add .gitignore && git commit -m“忽略照片规则”` (2认同)

Bha*_*wat 7

一个非常简单的答案是.

步骤1:

首先使用git add .或添加要删除的未跟踪文件git add <filename>.

第2步:

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


Kir*_*iya 7

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

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

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


小智 6

步骤1

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

第2步

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

第三步

git push -f origin branch
Run Code Online (Sandbox Code Playgroud)

非常感谢@mu。

  • ...我一直认为git比它要难得多,这证明了这一点。任何人都无法记住大多数git命令的存在,更不用说他们的标志和怪癖了。Git模型是有道理的,它可以一直工作到您遵循简单的流程,并且一旦被卡住,就会被卡住。 (6认同)
  • 这是对我有用的解决方案,我需要`--ignore-unmatch` (2认同)

小智 6

使用这个对我有用

git rm -f --cached <filename>
Run Code Online (Sandbox Code Playgroud)