如何从bitbucket中的旧提交中删除大文件

时间:2015-10-08 10:42:06

标签: git github bitbucket

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

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

  • 检测我的回购历史记录中的胖文件

    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

但情况变得更糟,现在我的远程仓库是2GB! 我怎样才能解决这种糟糕的情况? 您是否建议创建一个新的回购或者我还能做些什么来解决它?

谢谢。

编辑:我尝试更好地制定问题。几个月前,我多次向我的回购承诺了一些大文件。当我意识到这一点时,我将这些文件添加到.gitignore。然后我一直在没有这些文件的情况下承诺回购。我没有注意bitbucket警告(你的回购太大了)。现在,我需要摆脱存储在旧提交中的这些文件,包括本地和远程。我使用上述过程成功清理了本地 git目录。我的问题是,当我推送到远程主分支时,远程仓库不受本地清理的影响。

编辑2: 我在我的本地.git目录上尝试了BFG repo cleaner

java -jar bfg-1.12.3.jar --strip-blobs-bigger-than 100M

here输出。

根据这个tutorial,这应该足以删除远程仓库上的blob,但实际上这并没有发生。本地我的回购很苗条,但远程仍然很大。我想我只是缺少一步,但不知道该怎么做。你认为创建一个新的回购更容易吗?

2 个答案:

答案 0 :(得分:0)

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

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

这可能会清理远程存储库。

答案 1 :(得分:0)

实际上,我只需要联系Bitbucket support(他们在不到一个小时内回复)。他们做了:

 git gc

从他们这边,我的远程仓库回到当地的仓库大小。