我偶然在我的项目文件夹中添加了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
。但从那时起我多次承诺并在代码中做了很多改变。
答案 0 :(得分:61)
在您的情况下,请使用git filter-branch
代替git rm
。
git rm
将删除文件,因为它们将不再被git跟踪,但这并不会删除与这些图像对应的旧提交对象,因此您仍然会被推迟对应12GB图像的提交。
另一方面,git filter-branch
也可以从之前的所有提交中删除这些文件,从而无需推送任何文件。
使用命令
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
检查this,this和this以获取进一步的帮助。为了更加安全,我建议您在继续执行这些说明之前在系统上创建一个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)
这种链在我的案例中起作用:
git rm -r WebApplication/packages
有一个确认git-dialog。你应该选择“y”选项。
git commit -m "blabla"
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 ?? []))
时,它删除了嵌套的重复项。