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

我不小心添加,提交并将一个巨大的二进制文件与我最新的提交到一个Git存储库。

我怎样才能让Git删除已经创build的对象,以便我的.git目录再次缩小到一个合理的大小?

编辑 :感谢您的答案; 我试了几个解决scheme。 没有工作。 例如,GitHub中的一个从历史logging中删除了这些文件,但是.git目录的大小没有减less:

 $ 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_datahttp://img.dovov.com001.jpg' [...snip...] rm 'test_datahttp://img.dovov.com281.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垃圾,直到他们可能想出额外的configurationvariables:

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

– 冲突选项可能会有所帮助。

注:这将删除所有未被引用的东西,所以如果你以后决定要保留其中的一部分,请不要哭泣。

你可能也需要先运行这样的东西,哦,亲爱的,混帐是复杂的!

 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 

我把这一切放在脚本里,在这里:

http://sam.nipl.net/b/git-gc-all-ferocious

你的git reflog expire --all都不正确。 它删除比expire时间早的reflog条目,默认为90天。 使用git reflog expire --all --expire=now

我对类似问题的回答涉及真正清理存储库中未使用的对象的问题。

这个删除敏感数据的指南可以应用,使用相同的方法。 您将重写历史logging,以删除其中存在的每个修订版本中的该文件。这是破坏性的,并且会导致回购与其他任何结帐冲突,因此首先警告任何合作者。

如果你想保留二进制文件在其他人的回购,那么没有真正的方法去做你想要的。 这几乎是全部或没有。

1)从git repo(&不是文件系统)中删除文件:

  • git rm --cached path/to/file

2)缩小回购使用:

  • git gc

  • git gc --aggressive

  • 或者git prune

或者在这个问题中build议的上述组合: 减lessgit存储库大小

对我来说,关键是运行git repack -A -d -f ,然后git gc来减less我拥有的单个git包的大小。

海兰!

Git只接收克隆存储库时实际需要的对象(如果我理解正确)

所以你可以修改最后一个提交的错误,删除错误添加的文件,然后将你的修改推送到远程仓库(使用-f选项覆盖服务器上的旧提交)

然后当你制作一个新的repo克隆时,它的.git目录应该和提交的大文件一样小。

或者,如果您想从服务器上删除不必要的文件,则可以删除服务器上的存储库,并将新克隆的副本(具有完整的历史logging)

 git filter-branch --index-filter 'git rm --cached --ignore-unmatch Filename' --prune-empty -- --all 

请记住要更改要从存储库中删除的Filename

请参阅Pro Git书中的“删除对象”:

http://git-scm.com/book/en/Git-Internals-Maintenance-and-Data-Recovery#Removing-Objects

更新:另见BFG回购清洁: http : //rtyley.github.io/bfg-repo-cleaner/