如何从git仓库中完全删除文件?


78

我最近注意到,文本编辑器使用的项目文件(以及其他一些垃圾邮件)已为该项目添加了git存储库。由于它们实际上不是项目的一部分,因此我想删除它们,但git rm不从存储库中删除旧版本,因此我找不到其他看起来很有希望的东西。


Answers:


140

您想要的工具是git filter-branch这里描述它的用法,但基本上是:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD

将从每个提交中删除“ my_file” 。

请注意,这会重写每个提交,因此,如果您推送到远程存储库,则必须(a)强制执行更新,并且(b)从您那里拉出的其他所有人现在都将具有重复的提交(因为您重写了历史记录),如下所示:在git rebase手册页上描述。


19
我建议添加,--prune-empty这样生成的所有空提交也将被删除。
fnkr 2014年

这如何在存储库中具有许多在不同目录中具有相同名称的文件的情况下工作?是否删除所有具有相同名称的文件?

2
@CodeMonkey:在这种情况下,您将使用更长的唯一路径。
mipadi

1
以后我该git push --force怎么办?@mipadi
alper

1
@mipadi,如果很久以前在本地删除这些文件怎么办?(并提交并推送了这些删除操作)在这种情况下,如何从存储库中删除文件?
mannyglover

11

这样做的目的git filter-branch是,但是请注意,您的回购历史记录将更改,并且在重写历史记录后,提交哈希将有所不同。

如果您还想释放空间,我建议您使用git forget-blob,因为git filter-branch单独使用git不会使git忘记您的文件,因为它可能仍被远程,reflog,标记等引用。

git forget-blob main.c.swp

您可以在这里获得更多信息

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.