【问题标题】:Shrinking Git Repo - Object in packet, not in commits缩小 Git Repo - 数据包中的对象,而不是提交中的对象
【发布时间】:2013-08-28 11:17:10
【问题描述】:

我正在尝试缩小大约 2GB 的 Git 存储库。

我正在遵循 ProGit 书中第 9 章 (9.7) 的“删除对象”部分: http://git-scm.com/book/en/Git-Internals-Maintenance-and-Data-Recovery

在运行git gc,然后是git verify-packgit rev-list 命令后,我发现了一个大约118MB 的.tar 文件。我根本不需要它在我的回购中。它需要永远摧毁。

但是当我试图找出哪些提交使用了该文件时,我什么也没得到:

git log --oneline -- news/news.tar

这是否意味着该文件不在存储库历史记录中?如果是这种情况,我可以留下它,还是在我做git push 时它仍然会作为一个对象被推上去?

如果是这样,我该如何摆脱它。

【问题讨论】:

    标签: git git-rewrite-history git-rev-list git-verify-pack


    【解决方案1】:

    使用 BFG,而不是 git-filter-branch...

    BFG 提供了一种删除大文件的万无一失的方法,比使用git filter-branch 容易得多,请参阅http://rtyley.github.io/bfg-repo-cleaner/

    $ bfg  --strip-blobs-bigger-than 100M  my-repo.git
    

    ...还在吗?

    如果您想弄清楚在按照 ProGit 手册第 9.7 节中“删除对象”中的步骤操作时出了什么问题,很遗憾,有几个地方可能会出错。

    news.tar 文件当前由您的一个分支、标签或其他类型的 ref 保存 - 我们知道这一点是因为当您运行 git rev-list --objects --all 时该文件出现了(“--all”参数表示查看所有 refs,除了分支 - 标签和其他外来类型的 ref) ...但是您的 git log --oneline -- news/news.tar 命令没有 --all,它只是列出您当前的分支。您的 blob 由不同的引用持有 - 可能是不同的分支或标签。

    说真的,只需使用 BFG。

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

    【讨论】:

    • 谢谢,我一直在研究 BFG,但它不适用于路径,所以我认为我不能使用它。我想使用--delete-files 命令,但我有一个大图像(不知何故,在 repo 中有一个 60Mb JPG),但文件的较小版本,同名,存在于其他地方。
    • 它非常适合我知道只有其中一个的文件
    • AAAAAAH 我刚刚发现了这个:--strip-blobs-with-ids。可能会这样做
    • 好的,我用过 BFG,它很棒,但文档有点薄。我通过运行我的 bfg 别名找到了我需要的额外选项,而没有额外的命令。我使用了--delete-files 的通配符,以及我使用的特定文件和路径的博客列表 `--strip-blobs-with-ids`
    • 哇,使用 BFG 甚至清理/修复了我的历史记录中的更改,其中过滤器分支的错误使用引入了!这值得更多的投票来获得应有的关注。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2017-09-10
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多