2012-05-18 31 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

您可以总结一下您最终采取的确切步骤,依次在答案中?我有类似的问题,我想尝试修复它。 –

相关问题