20

我一直在玩 BFG Repo-Cleaner 工具,以便通过从目录层次结构中的多个位置删除(临时/大)文件来清理 git repo 的历史......

即 /root/test/a.txt /root/test2/a.txt

现在我想删除“test/a.txt”的所有引用,但保留/test2/a.txt 版本..

有什么方法可以使用 BFG 彻底删除它?(如https://help.github.com/articles/remove-sensitive-data所述)

由于回购具有相当大的历史(10K 提交)BFG 确实比我迄今为止看到的其他方法快很多......

4

1 回答 1

33

我是The BFG的开发人员,我很高兴您发现它有用且快速。使 BFG 如此快速的部分特殊原因在于它是路径无关的 - 所以你不能直接说类似--delete /root/test/a.txt. 我正在考虑为依赖路径的操作添加一些支持,但我不希望它对性能产生不利影响。

清理仓库时的关键问题是:在这两个选项中,您要实现什么目标:

  • 减少 Git 存储库大小
  • 删除私人数据

从您的问题来看,听起来您唯一的目标是第一个目标,即减少 Git 存储库的大小。如果/root/test/a.txt它相当小 - 即大小与您存储库中的其他合法文件相当 - 您不能真正使用--strip-blobs-bigger-than X它来摆脱它,因为它会删除太多其他常规文件。但如果这种情况,我会放松一下,放手——与整个回购相比,它不会花费你太多的存储空间。

如果/root/test/a.txt大到足以打扰您,您可能只是--strip-blobs-bigger-than X用来摆脱它 - 请记住,BFG 保护您当前提交中的所有文件(如果您使用,甚至可以保护更多分支--protect-blobs-from <refs>) - 您当前正在使用的合法大文件不会被触动。

如果你真的想摆脱这个可怜的无害文件,但又不想过滤大小,有两个 BFG 支持的选项:

利用--delete-folders test

...这将删除整个文件夹/root/test/(以及所有其他名为“test”的文件夹),但不会删除/root/test2/. /root/test/如果您想保留其他东西,则没有多大用处。

利用--strip-blobs-with-ids <blob-ids-file>

...您必须查找曾经存在的所有 Git blob-id /root/test/a.txt,您可以使用以下 git 命令来完成:

git log --format=%H -- /root/test/a.txt | xargs -IcommitId git rev-parse commitId:/root/test/a.txt
于 2014-01-16T21:06:07.027 回答