2012-05-18 33 views
17

我已經使用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商店參考,我不知道?

+0

通過'git clone --bare my-repo'克隆版本庫會生成'my-repo.git',它的大小也是205MB,所以不需要;包文件及其巨大的內容隨克隆而來。 – meagar

+0

你刪除的答案很有趣,可能對別人有用 - 你會考慮編輯你的問題來描述你所做的命令的真實順序,然後回覆一個解釋'refs/original' refs被包裝的答案嗎? (這是一個微妙的一點,你可以有包裝文件中存在的參考文獻,而不是'refs'下的文件。) –

+0

@MarkLongair我還在玩耍,試圖從我刪除的答案中重現結果。我已經克隆了repo,發現在運行'rm -rf .git/refs/original'之前運行'git repack -a' *確實不會影響結果。它似乎沒有影響'.git/refs/original'的內容。 – meagar

回答

7

在克隆存儲庫的全新副本時,我能夠像上面那樣運行剛好的命令,並獲得所需的結果:我的.git目錄從205 MB減少到20 MB,而大FLV文件被從包文件中徹底刪除。

第一次嘗試也是在我沒有做任何修改的新克隆上進行的,所以我沒有滿意的解釋爲什麼FLV文件繼續留在packfile中。

我最初提交以下的答案,想着,我會產生的問題通過運行git repack -a去除.git/refs/original,導致原來的裁判成爲包裝,這樣,當我沒有刪除.git/refs/original沒有生效;我的原始參考文獻仍然會引用大型的FLV文件。但是,這似乎並不成立。運行上面的命令,在之後立即添加git repack -a,似乎不會影響結果 - FLV文件仍然從packfile中清除。我沒有理由相信這與原始問題有關。


有一些其他的方式,Git會把裁判,我不知道?

還有。事實證明,我並不完全忠於上面列出的命令的順序。我運行git repack -a之前運行rm -rf .git/refs/original,和Git包裝裁判(待定)在哪裏;現在試驗)。當我然後跑rm -rf .git/refs/original,沒有被刪除。 git gc無法縮小我的包文件,因爲確實由於包裝refs/original參考文獻而仍舊有對舊文件的引用。

+0

關於在哪裏打包裁判,請參閱'.git/packed-refs' – twalberg

+4

您可以總結一下您最終採取的確切步驟,依次在答案中?我有類似的問題,我想嘗試修復它。 –

相關問題