要刪除所有提交歷史的一個大的不必要的文件,您可以使用filter-branch
改寫每個指數(文件在回購名單)提交因此從未被添加的文件。重寫提交歷史修改一個文件
git filter-branch --index-filter "git rm --cached --ignore-unmatch path/to/offending_file.wav" --tag-name-filter cat -- --all
但是,如果我想保留該文件,但讓它小了很多(例如,想象一下,如果一個圖標是一個巨大的圖像存儲意外)的東西。我嘗試這樣的做法:
加上一個替換文件到Git的數據庫
HASH=`git hash-object -w /tmp/replacement.png`
另外請注意,我們要替換
FILE="path/to/icon.png"
現在篩選指標如下文件:首先檢查文件存在於此次提交中:
git cat-file -e :"$FILE"
如果是這樣從索引中刪除它:
git rm --cached "$FILE"
最後,使用相同的文件名添加對我們替換的引用。
git update-index --add --cacheinfo "100644,$HASH,$FILE"
全部放在一起:
git filter-branch --index-filter "if git cat-file -e :$FILE ; then git rm --cached $FILE ; git update-index --add --cacheinfo 100644,$HASH,$FILE ; fi" --tag-name-filter cat -- --all
這似乎是工作,不會打印可太嚇人任何錯誤。但是,無論有多少git gc
和prune命令我嘗試原始blob仍然存在於存儲庫中。即使我將回購克隆到一個新的地方,它仍然存在。
我懷疑這是因爲遠程參考,original
引用哪個filter-branch
創建仍然指向舊的樹,所以原始文件仍然引用。
我曾嘗試用這樣的黑客刪除他們都:
for REF in `git show-ref | cut -c 42- | grep original` ; do git update-ref -d $REF ; done
與同爲remotes
,但斑點仍然存在。
所以我的問題:
- 有沒有辦法,看看爲什麼斑被當作垃圾回收?即父母對象在圖中指向它?
- 是否有非哈克的方式去除
originals
裁判(也許該遙控器) - 包括所有的分支和標籤? - 還有什麼我失蹤?
是否有包含這個大文件的_many_提交,這樣手動重寫歷史記錄不是一種現實的可能性? –
是100次提交。 – Timmmm