BFG Repo Cleaner 的正确使用方法

Correct Usage of BFG Repo Cleaner

BFG Repo Cleaner 站点给出了使用该工具清理存储库的示例:

  1. 克隆您的存储库的新副本。

    $ git clone --mirror git://example.com/some-big-repo.git
    
  2. 运行 BFG 来清理你的仓库。

    $ java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
    
  3. 使用git gc 剥离不需要的脏数据

    $ cd some-big-repo.git
    $ git reflog expire --expire=now --all && git gc --prune=now --aggressive
    
  4. 将更改推送回远程

    $git push
    

我知道 head 分支是受保护的,因此 head 分支中任何大于 100M 的文件仍然存在。如果我 运行 按照描述使用此工具,我将丢失任何历史记录 所说的 100M 文件是否正确?因此,如果旧提交中有该文件的旧版本,它就消失了,我将无法在它以前的状态下使用它……对吗?

此外,我有一位同事说了以下内容,我想知道这是否属实:

如果您推回到 TFS 中镜像的存储库,则对您的包文件所做的更改将不会反映在远程和未来的克隆中

您必须在 TFS 中创建一个新的存储库并将镜像推送到那里,以便远程选择包文件更改。

任何仍然存在于 repo 头部的文件都将被保留,包括历史记录。这是为了保护你不犯错误。这个想法是您应该明确删除文件,提交删除,然后清理历史记录以将其删除。

TFS 没有 gc 它的 repos;你的同事是对的。请参阅 进行确认。

不久我还使用 BFG Repo Cleaner 从 TFS 的 git 存储库中删除了一些文件夹。

如果你还想修改头部,使用参数--no-blob-protection

显然,在清理过的(旧的)提交中,您清理过的文件丢失了。提交仍然存在,但每个相应的提交中都缺少该文件。您将无法查看文件历史记录。

出于安全原因,我总是会重命名旧的存储库并创建一个新的。甚至可能使用另一个回购名称,这样我的 co-workers 就不会将错误的回购合并到他们的工作副本中。

如果您确实需要,可以 git push --all -force 并重写 TFS 存储库中的完整历史记录。但是后来旧的历史就过去了。