2010-08-11 162 views
57

我最近注意到我的文本编辑器使用的项目文件(以及其他一些垃圾文件)为项目添加了git存储库。因为它们实际上并不是项目的一部分,所以我想删除它们,但git rm不会从存储库中删除旧版本,而且我也找不到其他任何看起来很有前途的东西。如何从git存储库中完全删除文件?

+3

部分重复,由以前的问题肯定覆盖:http://stackoverflow.com/questions/307828/git-remove-file-accidentally-added-to -the-repository http://stackoverflow.com/questions/1216733/remove-a-directory-permanently-from-git – Cascabel 2010-08-11 13:25:24

回答

110

你想要的工具是git filter-branch。它的使用说明here,但基本上是:

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

将从提交删除 “my_file”。

请注意,这将重写所有提交,因此如果您推入远程存储库,则必须(a)强制更新,并且(b)其他所有从您那里提取的人现在都会有重复的提交(因为您重写了历史),如git rebase man page所述。

+15

我建议添加'--prune-empty',这样生成的任何空提交都将被删除太。 – fnkr 2014-08-28 07:21:14

+0

这是如何工作在不同目录中具有相同名称的许多文件的存储库?它是否删除所有具有相同名称的文件? – CodeMonkey 2016-11-21 10:01:20

+1

@CodeMonkey:在这种情况下,您将使用更长,唯一的路径。 – mipadi 2016-11-21 19:27:32

5

这是git filter-branch的用途,但请注意,您的repo历史记录将会更改,并且历史记录重写后提交哈希将会有所不同。

如果你还想释放空间,我建议你使用git forget-blob,因为git filter-branch本身不会让git忘记你的文件,因为它仍然可以被遥控器,reflog,标签等引用。

git forget-blob main.c.swp

你可以得到更多的信息here