git - 无法从 Git 存储库中删除 blob

标签 git blob

我有一个仅限本地的存储库,它曾经包含非常大的文件(扫描和一些数据库文件)。在某些时候,我决定删除包含所有这些目录的目录,并重写历史记录以根除有问题的目录。

我最终得到了一个非常轻量级的 repo,但是 .git 目录仍然需要 1.3G 的空间。只有一包,我发现这包中至少有一个 blob 占用了大量空间。

我尝试了很多方法来清理存储库,包括各种 git gc 调用,但没有任何效果,甚至 git forget-blob 也没有。 Git forget-blob 告诉我“在 repo 历史中找不到”。

那时,我迷路了。任何帮助表示赞赏。

谢谢!

编辑:一些我觉得很奇怪的附加信息。 Git verify-pack 显示了 3 个非常大的文件:

git verify-pack -v .git/objects/pack/pack-5cc03e9fbdbdff4ce1bbeb43c55c3e17875f2bd7.idx| sort -k 3 -n | tail -3
4983118ae60be35299b153dc5850134329f6ddf0 blob   7336960 2000979 615935480
5c810dfffa6a033631596218c43a7360cf2aff10 blob   12455669 1197771 6330554
25012927d95cf3bd15f2a8cb30da2c4f4b988e82 blob   105476096 83834099 532101381

但是,我无法获得有关这些 Blob 的任何信息。这怎么可能?

git rev-list --objects --all  | grep 250129
zsh: done       git rev-list --objects --all | 
zsh: exit 1     grep --color 250129

最佳答案

有很多事情需要考虑:

  • reflog 中的任何修订是否指向任何先前的修订(重写之前)?
  • 是否有任何存储对象指向任何旧版本?
  • 是否有任何远程分支指向任何旧版本?

为了说服 git 删除一个对象,应该有没有指向它的指针。另一件需要考虑的事情是对象保存在“包”中。记得有一次我不得不把我所有的pack文件都“炸开”(也就是让git把所有对象放到FS上),然后把pack文件删了再让git重新pack。

https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery

检查关于“删除对象”的部分。希望这足够好。

关于git - 无法从 Git 存储库中删除 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906491/

相关文章:

azure - 如何将 Airflow 日志发送到 Azure Blob 存储

git - 如何使用 TortoiseGIT 更新 GitHub 分支存储库?

git - 如何从 pull 请求中删除提交?

git - 在不使用 Git 的情况下在 GitHub 存储库中创建文件夹

git - 独立的开发和部署 git 存储库

java - 如何使用 mvc 在数据库中存储图像或任何类型的文档

javascript - jQuery AJAX 响应以字符串 blob 形式出现

git - 是否有某种 'git rebase --dry-run' 会提前通知我冲突?

MYSQL TINYBLOB 与 LONGBLOB

oracle - 如何从 Oracle BLOB 字段中提取文件?