2010-08-11 158 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