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

时间:2014-08-23 04:00:33

标签: 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

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

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

public/photos/
*.zip

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

10 个答案:

答案 0 :(得分:61)

在您的情况下,请使用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
    
  5. 检查thisthisthis以获取进一步的帮助。为了更加安全,我建议您在继续执行这些说明之前在系统上创建一个repo的备份副本。

    至于你的orignial错误消息,它正在发生,因为你已经使用git rm取消了它们,因此git抱怨,因为它无法删除它不跟踪的文件。阅读more about this here

答案 1 :(得分:5)

第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。

答案 2 :(得分:5)

一个非常简单的答案是。

第1步:

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

第2步:

然后使用命令git rm -f <filename>轻松删除它们 rm =删除, -f =强制删除。

答案 3 :(得分:3)

使用它对我有用

git rm -f --cached <filename>

答案 4 :(得分:1)

rm

做了这个工作, 它使用git rm而不是{{1}}恢复了我删除的文件。

我首先检查了最后一个哈希,但我不相信它是必需的。

答案 5 :(得分:1)

这种链在我的案例中起作用:

  1. git rm -r WebApplication/packages
  2. 有一个确认git-dialog。你应该选择“y”选项。

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

仅供参考,我注意到我有一些权限为 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

答案 8 :(得分:0)

有时会在您不跟踪文件时使用 git add untracked file name 添加文件,之后只需执行 git rm -r file name

答案 9 :(得分:-1)

我有一个重复的目录(〜web / web),当我在第一个Web文件夹中运行count(($user ?? []))时,它删除了嵌套的重复项。