清理掉过时的大型git存档blob

时间:2014-04-11 09:06:33

标签: git bitbucket

我的情况是,许多庞大的JPG已经进入我们的仓库,增加了100多个MB,远远超过了src代码本身。

我已经优化了这些JPG,其文件大小消耗不到1/20,否则没有可察觉的变化。承诺并推迟。

但是,本地副本仍然会在.git存档中使用此磁盘空间(内部包含所有文件的所有先前版本)。任何新的拉动也会浪费这个空间。

我们的原创大师是Bitbucket。

我花了很多时间试图从像

这样的好导游中找到答案

http://otomaton.wordpress.com/2012/12/17/saving-disk-space-by-garbage-collecting-in-git-repositories/ 使用

 git gc

http://linux.yyz.us/git-howto.html

How to remove local (untracked) files from the current Git working tree? 这表明

git clean -n

什么可能只是简单地从档案中的一个特定提交中清除这些巨大的JPG文件,甚至从在线Bitbucket仓库清除,所以没有人必须再次提取它们? 我们当然想要

  • 要保留的所有文件的当前版本
  • 尽可能多地修改历史记录&保存之后,至少知道有提交的内容(因为其他非jpg文件也受到了影响)
  • 有200多个JPG文件。这项行动可以一举完成吗?在某些参数中使用* .jpg等通配符,还是使用for循环?

我们不想要的大型JPG版本文件的回购中没有先前版本。

我尝试过的事情:

  • 在任何事情之前,使用多少磁盘空间.git?
du
72195   ./.git
  • 查找重量级blob:
git verify-pack -v .git/objects/pack/pack-*.idx |sort -k 3 -n |tail -39
...
03bcb7d79c1e0a4328420bf00647319465d5d3df blob   2446210 2430913 46915147
52ea2d848645463e01d3dd143dd8d7fd24019335 blob   2467254 2443333 27573576
12d63348c0e87f9602d395e694df6a94601c12f7 blob   2506409 2485495 49346060
645fe7bfaf6ecd0140d144b4c40c19e78f103bd6 blob   2581349 2554398 10567725
72672204aa3c7aec431cba02b32ac012e52e601d blob   3084793 3041294 13122123
  • 最后一个大blob包含了什么?
 git rev-list --objects --all |grep 72672204
72672204aa3c7aec431cba02b32ac012e52e601d images/2.jpg
  • 哪些提交影响了这个特定的文件images / 2.jpg(我希望杀死的许多不需要的副本之一)?
git log --pretty=oneline --branches -- images/2.jpg
98dc75de48a63c2ab9661eb62895ac39ef331aaa MAPSDH-10 #time 30m #comment Grab live copy of Simon's source and push it onto Bitbucket repo; master@gordito,2014-04-10_13-55-02
3e7f36f0b1a913feaf43547bca4ad3a5a08957a6 MAPSDH-10 #time 30m #comment Grab live copy of Simon's source and push it onto Bitbucket repo; master@gordito,2014-04-10_13-31-49
  • 好的,所以尝试在提交#3e7f36f0之前仅删除images / 2.jpg的副本,包括:
 git filter-branch --index-filter 'git rm --cached --ignore-unmatch images/2.jpg'  -- 3e7f36f0^..
Cannot rewrite branches: You have unstaged changes.
  • 由于它拒绝,只需将其从缓存中删除:
 git rm --cached --ignore-unmatch images/2.jpg
rm 'images/2.jpg'
  • 但是,我希望images/2.jpg的当前版本仍然在回购中!

  • 计算本地git档案的文件空间使用情况:

git count-objects -v
count: 0
size: 0
in-pack: 284
packs: 1
size-pack: 72101
prune-packable: 0
garbage: 0
size-garbage: 0
  • size-pack仍然是72101(72MB,原点du)。无论如何,它似乎没有按预期释放3084793(3MB)。

1 个答案:

答案 0 :(得分:1)

嗯,您在历史记录中获得了这些图片,您应该重写历史记录并永久删除它们。

我已经编写了一个脚本,可以永久地从git中删除文件(包含历史记录),这里是:

#!/bin/bash
git filter-branch -f --prune-empty -d /dev/shm/scratch \
  --index-filter "git rm --cached -f --ignore-unmatch $1" \
  --tag-name-filter cat -- --all
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

您可以删除所有文件,然后删除它 - 提交新文件。

更多信息:http://git-scm.com/book/ch6-4.html

P.S。如果你想使用通配符 - 使用像for i in *.jpg; do git-rm-forever $i; done

这样的bash魔法