2009-08-01 111 views
48

在我個人的git倉庫中,我有一個包含數千個不再需要的小圖像的目錄。有沒有辦法從整個git歷史中刪除它們?我曾嘗試從git中永久刪除一個目錄

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD 

git filter-branch --tree-filter 'rm -fr imgs' HEAD 

但混帳回購協議的大小保持不變。有任何想法嗎?

感謝

+2

不確定,但你有沒有嘗試過後運行`git gc`?也許他們仍然存在垃圾... – 2009-08-01 14:50:51

+0

@Martinho:是的,我是 – adk 2009-08-01 15:16:31

+0

你必須刪除所有舊的引用(例如分支名稱,標籤),然後你可以運行`git gc --aggressive`。 – vdboor 2013-03-08 10:43:31

回答

32

的ProGit本書對Removing Object一個有趣的部分。

它不會這樣結束:

你的歷史不再包含該文件的引用。
但是,您的reflog和Git在.git/refs/original下執行filter-branch時添加的一組新參考仍然存在,因此您必須將其刪除,然後重新包裝數據庫。你需要擺脫任何有指向那些老提交你改裝之前:

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 
$ git gc 
$ git prune --expire 

git prune --expire不是強制性的,但可以從鬆散的對象刪除目錄內容)
備份一切做之前這些命令,以防萬一;)

+0

這本書的鏈接不起作用了:-( – rescdsk 2012-09-07 18:01:53

+3

@rescdsk我已經恢復了鏈接 – VonC 2012-09-07 18:33:36

13

git-filter-branch默認保存refs/original/*命名空間中的舊引用。

您需要刪除它們,然後git gc --prune=now

3

如果你想要去的手動清除路線,也有一些更多的文件還可以包含 的git-前裁判原來的分支的位置過濾分支。 例如,我過濾我的 「家」 的分支:

的.git /信息/裁判:

179ad3e725816234a7182476825862e28752746d裁判/原廠/裁判/頭/家

。混帳/填充裁判:

179ad3e725816234a7182476825862e28752746d裁判/原廠/裁判/頭/家

之後我刪除這些行,gitk沒有表現出老犯了。

10

布蘭登湯姆森問到賴BLOME的解決方案評論,如果這只是固定的gitk視圖,或者如果裁判會真的走了。檢查這方面的一個好方法是記住老提交的SHA1哈希的一個(或它的一個獨特的前綴),並嘗試

$ git ls-tree hash-value 

這應該告訴你的回購的內容主文件夾,因爲它是在這個提交。如通過VonC示出和除去.git/info/refs.git/packed-refsrefs/original/…線通過賴BLOME,如圖

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 

之後的最終

$ git gc --prune=now 

製成不僅裁判,還舊對象(提交,樹和blob)消失。以上顯示git ls-tree hash-value證明了這一點。 另一個很好的命令來檢查這是git count-objects -v(在過濾器之前和修剪之後運行並比較大小)。

注意:由於我還不能評論其他答案,我不得不寫一個新的答案,雖然它主要結合了以前給出的答案。

2

由於這是一個古老的問題,可能當時有些問題是不可能的。這也假設你使用bash或者cygwin。

警告:第二行和第三行將永久刪除您的分支/標記無法訪問的所有提交。

運行filter-branch後,做

for ref in $(git for-each-ref --format='%(refname)' refs/original); do git update-ref -d $ref; done 
git reflog expire --expire=now --all 
git gc --prune=now 

git for-each-ref --format='%(refname)'得到參考名稱,git update-ref -d刪除參考。通常最好不要直接修改.git文件夾,特別是當該命令在packed-refs中時,該命令處理該情況。

第二行和第三行是直接從How to clean up unused side-branches in your commit trees?