我已經使用git filter-branch
重寫了我的存儲庫的歷史記錄以刪除一些大的FLV文件。我主要是跟着上removing sensitive data GitHub的文章文章和類似說明在互聯網上的其他地方找到:爲什麼大文件仍然存在於我的包文件中,然後用filter-branch擦除它們?
卸下大FLV文件:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all
拆除原裁判:
清除引用日誌:
git reflog expire --expire=now --all
修剪不可達對象:
git gc --prune=now
Aggressivly修剪不可達的對象:
git gc --aggressive --prune=now
重新包裝的東西:
git repack -A -d
而且我gitdir仍然是205 MB,幾乎全部包含在一個單一的打包文件:
$ du -h .git/objects/pack/*
284K .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx
204M .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack
使用this script,我可以看到,我已經刪除FLV文件仍包含在包:
All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
size pack SHA location
17503 17416 1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0 public/video/XXX_FINAL.flv
17348 17261 b7aa83e187112a9cfaccae9206fc356798213c06 public/video/YYY_FINAL.flv
....
通過git clone --bare my-repo
產量my-repo.git
這也是205MB大小克隆庫。
如何從包中刪除這些(大概)未引用的對象,並將我的存儲庫縮小回原來的大小,如果他們從未提交過?如果它們仍以某種方式被引用,是否有辦法告訴哪裏?
更新
在試圖重新運行git filter-branch
,我接到了該通知:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
我覈實,有沒有裁判在.git/refs/original
,的確,目錄不完全存在。有沒有其他的方式,git商店參考,我不知道?
通過'git clone --bare my-repo'克隆版本庫會生成'my-repo.git',它的大小也是205MB,所以不需要;包文件及其巨大的內容隨克隆而來。 – meagar
你刪除的答案很有趣,可能對別人有用 - 你會考慮編輯你的問題來描述你所做的命令的真實順序,然後回覆一個解釋'refs/original' refs被包裝的答案嗎? (這是一個微妙的一點,你可以有包裝文件中存在的參考文獻,而不是'refs'下的文件。) –
@MarkLongair我還在玩耍,試圖從我刪除的答案中重現結果。我已經克隆了repo,發現在運行'rm -rf .git/refs/original'之前運行'git repack -a' *確實不會影響結果。它似乎沒有影響'.git/refs/original'的內容。 – meagar