几个月前我做了一些糟糕的提交后,我的bitbucket repo 变得很大(1.6 GB)。我没有意识到情况有多严重(傻瓜..),因为一个同事试图克隆它并失败了(太大)。

我仔细阅读了Why is my git repository so big?这篇文章,并做了以下工作(如@Vi建议):

  • 检测 repo 历史记录中的胖文件
    git rev-list --all --objects |     sed -n $(git rev-list --objects --all | \
    cut -f1 -d' ' | \
    git cat-file --batch-check | \
    grep blob | \
    sort -n -k 3 | \
    tail -n40 | \
    while read hash type size; do
     echo -n "-e s/$hash/$size/p ";
    done) |
    sort -n -k1
    

    假设其中一个胖文件是mybigfile.gz
  • 从 repo 中删除mybigfile.gz
    git filter-branch -f  --index-filter \
    'git rm --force --cached --ignore-unmatch mybigfile.gz' \
    -- --all
    rm -Rf .git/refs/original && \
    git reflog expire --expire=now --all && \
    git gc --aggressive && \
    git prune
    

  • 实际上,它可以正常工作,因为现在我的本地repo目录为850MB。
    问题是远程存储库没有更改大小。
    然后我试图
    git push origin --force --all
    

    但是情况变得更糟,现在我的远程 repo 是2GB!
    我该如何解决这种可怕的情况?
    您是否建议创建一个新的仓库,还是可以做些其他的事情来解决呢?

    谢谢你。

    编辑:我试图更好地阐述问题。几个月前,我多次 promise 要 repo 一些大文件。当我意识到这一点时,我将这些文件添加到了.gitignore中。然后,我继续提交没有这些文件的 repo 协议(protocol)。我没有注意位桶警告(您的存储库太大)。现在,我需要删除存储在本地和远程的旧提交中的这些文件。我使用上述步骤成功清理了本地git目录。我的问题是,当我推送到远程主分支时,远程 repo 不受本地清理的影响。

    编辑2:
    我在本地.git目录中尝试了BFG repo 清洁器
    java -jar bfg-1.12.3.jar --strip-blobs-bigger-than 100M
    

    here输出。

    根据这个tutorial,这应该足以除去远程 repo 上的 Blob ,但是实际上这没有发生。在本地,我的存储库很小,但是从远程来看,它仍然很大。我想我只想走一个步骤,但是不知道该怎么做。您认为仅创建一个新的 repo 协议(protocol)会更容易吗?

    最佳答案

    从评论中我了解到问题是在本地解决的,而不是在远程解决的。让我们做一些疯狂的科学,以强制使用以下命令取消所有对象的引用和垃圾回收(首先创建备份):

    git reflog expire --expire=now --all
    git gc --prune=now --aggressive
    git push -f
    

    也许这将清理远程存储库。

    关于git - 如何从Bitbucket中的旧提交中删除大文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33013500/

    10-14 14:31