git:找不到blob - 想从包中摆脱它

Eog*_*anM 12 git git-rewrite-history

我想要摆脱一大块斑点!我以为我使用这个解决方案删除了​​文件:http: //dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ (我用过-- --all而不是HEAD删除文件从所有分支机构)

rm -rf .git/refs/original/ && git reflog expire --all &&  
    git gc --aggressive --prune
Run Code Online (Sandbox Code Playgroud)

我通过这个看了包文件夹为什么我的git存储库这么大?

$ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k3n
... last 4 lines:
bc7ae9801052180b283cd81880753549f0f92587 blob   19464809 749446 305054873
acd5f09a35846bec25ebc324738139e5caabc50f blob   294278199 71381636 39607483
986d152935434b56cf182d8a32e24cb57af75ac3 blob   480385718 108184804 110989119
ba9d1d27ee64154146b37dfaf42ededecea847e1 blob   761172819 27430741 277589990
Run Code Online (Sandbox Code Playgroud)

该脚本git-find-blob取自哪个提交有这个blob?

$ ./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1
Run Code Online (Sandbox Code Playgroud)

但它没有找到任何东西.

任何想法如何摆脱我的存储库?

Lil*_*ard 7

您可以使用git repack -Ad强制git重建包,并将任何无法访问的对象解压缩为松散的对象.此时,您可以使用git gc --prune=now丢弃无法访问的对象.

您还应该仔细检查您的reflog实际到期了.我相信git reflog expire --all将默认为90天(或30个无法访问的对象),因此您可能想要使用git reflog expire --expire-unreachable=now --all(这需要在重新包装+ gc之前完成).


Mar*_*air 2

首先,在git gc调用中,您应该使用--prune=now,因为默认情况下是保留不到 2 周的对象。

其次,git-find-blob默认情况下使用的命令仅在HEAD提交的历史记录中查找,因此如果 blob 位于另一个分支上,则该脚本将错过它。尝试将其调用为:

./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1 --all
Run Code Online (Sandbox Code Playgroud)