繁体   English   中英

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

[英]How can i completely remove data from a git repository?

在我的项目中,我错误地将一些大图像文件添加到了我的仓库中。 我在GitHub上阅读了如何从历史记录中删除文件,它确实起作用:您再也看不到历史记录中的文件。 但是然后我从我的项目中制作了一个tar.gz进行备份,现在它的大小是以前的两倍 我没有添加任何其他可以证明这种增加的理由,因此我怀疑是用来表示图像文件的回购数据并没有真正从回购中剔除。 有人可以证实这一点吗? 有解决办法吗?

编辑以澄清我对git的了解很少,因此我完全按照GitHub帮助页面上指示的步骤进行操作,唯一的例外是我必须从第二个文件开始使用force开关,如git filter-branch -f --index-filter ...

为了部分回答我自己的问题,我认为我可以创建第二个git repo,而无需使用不需要的材料

  • 在其他位置创建一个空的仓库
  • 在项目的不同步骤中重现文件情况,而忽略了不必要的情况
  • 并最终使用该新仓库而不是旧仓库将材料推送到GitHub。

以前做过吗? 具体来说,我可以在GitHub上使用相同项目的新git repo代替旧​​的git repo吗?

顺便说一句,这到底值多少钱,这是关于我现在正在撰写的演示文稿 里面有一个Babel塔的图像,它以高分辨率存在于多个版本中,这说明了问题的大小(大约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体验git的复杂性是艰巨的。 我在这一点上放弃了。 我用一个小的一次性仓库进行了测试; 我做了一个初始提交,添加了一个大文件,做了一个提交,删除了文件,并试图从内存中删除其痕迹

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 YU SO STUBBORN?

没有任何git purge扩展程序可以做到这一点吗? 我的意思是, git filter-branch --index-filter 'git rm --cached --ignore-unmatch very-big-file.xcf' --prune-empty -- --all都不是我可以从内存中键入的内容当我有一点宿醉时。

一种快速的方法是使历史记录看起来完全像您想要的,将存储库添加为新的空存储库的远程目录,然后进行获取。 您只会在它们表示的历史记录中获得引用和对象。

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

重新“编辑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 YU SO STUBBORN ??” ...不丢失东西真的很努力。 即使当您试图使其丢失时,也是如此。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM