在我的项目中,我错误地将一些大图像文件添加到我的仓库中。我读了GitHub
如何从历史记录中删除文件,它确实有效:您无法再查看历史记录中的文件。然后我从我的项目中做了tar.gz
进行备份,现在它已经两倍了它以前的大小!我没有添加任何其他可以证明这种增加的理由,所以我怀疑用于表示图像文件的repo数据并没有真正被抛出回购。有人可以证实这一点吗?有没有修复?
编辑以澄清我对git知之甚少,所以我完全采用了GitHub help pages上指示的步骤,唯一的例外是我必须使用force
从第二个文件开始切换,如git filter-branch -f --index-filter ...
中所示。
部分回答我自己的问题,我想我可以创建第二个没有不需要的材料的git仓库
以前做过吗?具体来说,我可以在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
并不是我可以从记忆中输入的内容。
答案 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 ??” ......真的很难不丢失东西。即使你试图让它失去东西。 : - )