为什么用BFG

问题描述

这是我做的步骤:

  1. 创建了一个文件夹。

  2. 使用以下方法镜像我的存储库:

    git clone --mirror git@bitbucket.org:somespace/myrepo.git
    
  3. 使用以下命令获取 10 个最大文件的列表:

    git rev-list --objects --all \
    | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
    | sed -n 's/^blob //p' \
    | sort --numeric-sort --key=2 \
    | tail -n 10 \
    | cut -c 1-12,41- \
    | $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
    
  4. 假设最大文件名称largestFile.log

  5. 然后我运行 bfg 如下:

     java -jar bfg-1.14.0.jar --delete-files 'largestFile.log'
    
  6. 以上命令的输出显示要成功删除文件

    Deleted files
    -------------
    
     Filename                       Git id
     ------------------------------------------------
     largestFile 2015-05-18.log | bbaaa106 (1.3 GB)
    
  7. 最后按照上面第 6 步的输出建议,我接下来运行了:

    git reflog expire --expire=Now --all && git gc --prune=Now --aggressive
    
  8. 那也成功完成了。

现在,在推送之前,我想确保文件确实被删除了。所以我重新运行上面第 3 步中的命令。但其输出仍然在列表中显示 largestFile.log

我做错了什么?或者我在这里遗漏了什么?

有人可以解释或指导我吗。

谢谢!

解决方法

精美的手册说如果没有 --no-blob-protection 选项,HEAD 提交保持不变。这是你的问题吗?

默认情况下,BFG 不会修改您在 master(或“HEAD”)分支上最新提交的内容,即使它会清理 之前的所有提交。

那是因为您最近的提交很可能是您 部署到生产,并简单地删除私有凭证或 大文件很可能导致损坏的代码不再具有 它期望的硬编码数据 - 你需要解决这个问题,BFG 不能 为你而做。一旦你提交了你的更改 - 以及你最新的 提交是干净的,其中没有不需要的数据 - 您可以运行 BFG 对您的所有内容执行简单的删除操作 历史提交

...

如果你想关闭保护(一般情况下,不推荐)>你可以使用--no-blob-protection标志:

https://rtyley.github.io/bfg-repo-cleaner/