我已经使用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