如何从git存储库中完全删除数据?

时间:2012-03-24 20:17:24

标签: git repository size

在我的项目中,我错误地将一些大图像文件添加到我的仓库中。我读了GitHub 如何从历史记录中删除文件,它确实有效:您无法再查看历史记录中的文件。然后我从我的项目中做了tar.gz进行备份,现在它已经两倍了它以前的大小!我没有添加任何其他可以证明这种增加的理由,所以我怀疑用于表示图像文件的repo数据并没有真正被抛出回购。有人可以证实这一点吗?有没有修复?

编辑以澄清我对git知之甚少,所以我完全采用了GitHub help pages上指示的步骤,唯一的例外是我必须使用force从第二个文件开始切换,如git filter-branch -f --index-filter ...中所示。

部分回答我自己的问题,我想我可以创建第二个没有不需要的材料的git仓库

  • 在其他位置创建空仓库
  • 在项目的不同步骤中重现文件情况,遗漏了不需要的文件
  • 最后使用新的repo而不是旧的repo将材料推送到GitHub。

以前做过吗?具体来说,我可以在GitHub上使用新的git repo而不是旧的git repo吗?

不过,对于它的价值,这是关于a presentation我正在写的;有 巴塞尔塔的图像,它存在于高分辨率的几个版本中,这解释了问题的大小(约100MB的不需要的数据)。

编辑2 thx以获取建议;我做了

rm -rf .git/refs/original/
git reflog expire expire=now --all
git reflog expire --all
git gc --aggressive --prune=now

效果是*.tar.gz尺寸变小了0.5%......

编辑3 体验纯粹的复杂性是令人畏惧的。我现在放弃了。我做了一个小小的扔掉回购的测试;我做了一个初始提交,添加了一个大文件,做了一个提交,删除了文件并试图用内存擦除它的痕迹

rm very-big-file.xcf
git filter-branch --index-filter 'git rm --cached --ignore-unmatch very-big-file.xcf' --prune-empty -- --all
rm -rf .git/refs/original/
git reflog expire --all
git gc --aggressive --prune=now

这些是记录的*.tar.gz尺寸:

foo.tar.gz          7,518 
foo2.tar.gz    65,735,003 
foo3.tar.gz    32,777,155 

大文件的压缩大小为32,955,246字节,这使得完全可信的是它仍然完全存在于.git下,甚至可能是未压缩的形式。

GIT Y U SO STUBBORN ??

是否有任何git purge扩展名来执行此操作?我的意思是,当我有轻微的宿醉时,git filter-branch --index-filter 'git rm --cached --ignore-unmatch very-big-file.xcf' --prune-empty -- --all并不是我可以从记忆中输入的内容。

2 个答案:

答案 0 :(得分:0)

快速的方法是让历史记录看起来与您想要的完全一样,将repo添加为新的空的远程,然后只需获取。您只能获得它们所代表的历史记录中的引用和对象。

您现在可以将其推送到新的GitHub仓库。

答案 1 :(得分:0)

重新“编辑3”......这是一个完整的序列,我实际记录并重试这次以消除拼写错误。 :-)请注意,删除大文件后你不能filter-branch除非你提交删除(这个例子有点无意义)。检查du -s输出。

$ git init bigoop
Initialized empty Git repository in /tmp/bigoop/.git/
$ cd bigoop
$ echo tiny file with not much in it > tiny
$ git add tiny
$ git commit -m 'initial commit'
[master (root-commit) bd07e5a] initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 tiny
$ cp /path/to/huge/file hugefile
$ git add hugefile
$ git commit -m 'oops, add huge file'
[master 25cd764] oops, add giant file
 1 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hugefile
$ du -s .git
618992  .git
$ rm hugefile
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch hugefile' --prune-empty -- --all
Cannot rewrite branch(es) with a dirty working directory.
$ git checkout hugefile
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch hugefile' --prune-empty -- --all
Rewrite 25cd7647f49173fa8f42c0ca0a2ab8baf1842fca (2/2)rm 'hugefile'

Ref 'refs/heads/master' was rewritten
$ du -s .git
619012  .git
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
Counting objects: 3, done.
Writing objects: 100% (3/3), done.
Total 3 (delta 0), reused 0 (delta 0)
$ du -s .git
140     .git

至于“GIT Y U SO STUBBORN ??” ......真的很难不丢失东西。即使你试图让它失去东西。 : - )