git - 如何从 git 存储库中删除未使用的对象?

标签 git file object binary

我不小心添加、提交并推送了一个巨大的二进制文件,其中包含我对 Git 存储库的最新提交。

我如何让 Git 删除为该提交创建的对象,以便我的 .git 目录再次缩小到正常大小?

编辑:感谢您的回答;我尝试了几种解决方案。没有工作。例如,来自 GitHub 的那个从历史记录中删除了文件,但是 .git 目录大小没有减少:

$ BADFILES=$(find test_data -type f -exec echo -n "'{}' " \;)

$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $BADFILES" HEAD
Rewrite 14ed3f41474f0a2f624a440e5a106c2768edb67b (66/66)
rm 'test_data/images/001.jpg'
[...snip...]
rm 'test_data/images/281.jpg'
Ref 'refs/heads/master' was rewritten

$ git log -p # looks nice

$ rm -rf .git/refs/original/
$ git reflog expire --all
$ git gc --aggressive --prune
Counting objects: 625, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (598/598), done.
Writing objects: 100% (625/625), done.
Total 625 (delta 351), reused 0 (delta 0)

$ du -hs .git
174M    .git
$ # still 175 MB :-(

最佳答案

我在别处回答过这个问题,我会在这里复制,因为我为此感到自豪!

... 事不宜迟,我可以向您介绍这个有用的脚本 git-gc-all,它保证会删除您所有的 git 垃圾,直到它们可能提出额外的配置变量:

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 \
  -c gc.rerereresolved=0 -c gc.rerereunresolved=0 \
  -c gc.pruneExpire=now gc "$@"

--aggressive 选项可能会有帮助。

注意:这将删除所有未引用的东西,所以如果您稍后决定要保留其中的一些,请不要向我哭诉!

你可能还需要先运行这些东西,天哪,git 太复杂了!!

git remote rm origin
rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/
git for-each-ref --format="%(refname)" refs/original/ |
  xargs -n1 --no-run-if-empty git update-ref -d

我把所有这些都放在一个脚本中,在这里:

https://ucm.dev/t/bin.git/git-gc-all-ferocious

关于git - 如何从 git 存储库中删除未使用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3797907/

相关文章:

git - 如何使用子模块和 n 层 git 存储库策略

python - 远程 : ImportError: No module named gitlab

ssh 上的 git 守护进程 - 致命 : protocol error: bad line length character: SSH-

c - 从文本中读取数字并对数字进行排序

java - 如何在java中获取 "../../dir/file.ext"的完整真实文件路径?

c++ - 如何将ASCII文本文件合并,然后加密,再解密,放到一个 'File'的Class中? C++

PHP 在数组中存储对象引用

ruby-on-rails - 无法加载从 GitHub 获取的 Rails 应用; rake,rails 服务器不工作

javascript - 如何将多个对象组合成一个对象数组

java - Object.equals(Boolean, Boolean) 与逻辑运算符 (Java)