在我個人的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
但混帳回購協議的大小保持不變。有任何想法嗎?
感謝
在我個人的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
但混帳回購協議的大小保持不變。有任何想法嗎?
感謝
其實沒有這些技術workedfor我。 我發現最可靠的是是簡單地拉動地方到另一個回購:
git pull file://$(pwd)/myGitRepo
它還可以節省您的deletig舊標籤的麻煩。
看到這個故事在我的博客: http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/
的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
不是強制性的,但可以從鬆散的對象刪除目錄內容)
備份一切做之前這些命令,以防萬一;)
git-filter-branch默認保存refs/original/*
命名空間中的舊引用。
您需要刪除它們,然後做git gc --prune=now
如果你想要去的手動清除路線,也有一些更多的文件還可以包含 的git-前裁判原來的分支的位置過濾分支。 例如,我過濾我的 「家」 的分支:
的.git /信息/裁判:
179ad3e725816234a7182476825862e28752746d裁判/原廠/裁判/頭/家
。混帳/填充裁判:
179ad3e725816234a7182476825862e28752746d裁判/原廠/裁判/頭/家
之後我刪除這些行,gitk沒有表現出老犯了。
布蘭登湯姆森問到賴BLOME的解決方案評論,如果這只是固定的gitk視圖,或者如果裁判會真的走了。檢查這方面的一個好方法是記住老提交的SHA1哈希的一個(或它的一個獨特的前綴),並嘗試
$ git ls-tree hash-value
這應該告訴你的回購的內容主文件夾,因爲它是在這個提交。如通過VonC示出和除去.git/info/refs
和.git/packed-refs
的refs/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
(在過濾器之前和修剪之後運行並比較大小)。
注意:由於我還不能評論其他答案,我不得不寫一個新的答案,雖然它主要結合了以前給出的答案。
由於這是一個古老的問題,可能當時有些問題是不可能的。這也假設你使用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?。
不確定,但你有沒有嘗試過後運行`git gc`?也許他們仍然存在垃圾... – 2009-08-01 14:50:51
@Martinho:是的,我是 – adk 2009-08-01 15:16:31
你必須刪除所有舊的引用(例如分支名稱,標籤),然後你可以運行`git gc --aggressive`。 – vdboor 2013-03-08 10:43:31