13

我有一个大斑点,我想摆脱它!我以为我使用此解决方案删除了​​文件: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

我已经通过这个查看了 pack 文件夹为什么我的 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

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

$ ./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1

但它什么也没找到。

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

4

5 回答 5

8

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

您还应该仔细检查您的 reflogs 是否确实过期。我相信git reflog expire --all将默认为 90 天(或 30 天用于无法访问的对象),因此您可能想要git reflog expire --expire-unreachable=now --all改用(这需要在 repack+gc 之前完成)。

于 2011-09-21T19:53:54.980 回答
2

您想使用BFG Repo-Cleaner,这是一种更快、更简单的替代方案,git-filter-branch旨在从 Git 存储库中删除大文件。

下载Java jar(需要 Java 6 或更高版本)并运行以下命令:

$ java -jar bfg.jar  --strip-blobs-bigger-than 20M  my-repo.git

任何大小超过 20M 的 blob(不在您的最新提交中)都将从您的存储库历史记录中完全删除。然后,您可以使用git gc清除死数据:

$ git gc --prune=now --aggressive

BFG 通常比运行快 10-50 倍,git-filter-branch并且这些选项是围绕以下两个常见用例量身定制的:

  • 删除疯狂的大文件
  • 删除密码、凭证和其他私人数据

全面披露:我是 BFG Repo-Cleaner 的作者。

于 2013-02-01T22:30:37.950 回答
2

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

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

./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1 --all
于 2011-09-15T15:03:59.423 回答
1

blob 不会出现在干净推送的另一侧,所以这将是我的解决方案(推送到新位置,然后从该位置克隆)。有什么更简单的方法吗?

于 2011-09-21T19:27:53.750 回答
0

有同样的问题。发现我的麻烦 blob 被不可访问的树引用。添加到git-find-blob脚本:

git fsck --full --unreachable | \
while read unreachable obj tree
do
    if [[ ! $obj == "tree" ]]; then
        continue
    fi
    if git ls-tree -r $tree | grep -q "$obj_name" ; then
        echo "$unreachable $obj $tree"
    fi
done

我能够使用 BFG Repo-Cleaner 删除 blob,但我会更乐意使用本机 git 命令解决问题。

于 2013-10-08T21:14:56.960 回答