我一直在玩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上所述)
由于repo有一个相当大的历史记录(10K提交),BFG真的很多比我到目前为止看到的其他方法更快......
答案 0 :(得分:25)
我是The BFG的开发者,我很高兴你发现它很有用而且速度很快。使BFG如此之快的特殊酱油的一部分是它与路径无关 - 所以你不能直接说出像--delete /root/test/a.txt
这样的东西。我正在考虑为路径相关动作添加一些支持,但我不希望它对性能产生负面影响。
清洁回购时的关键问题是:在这两个选项中,您想要实现的目标是什么:
从你的问题来看,听起来你唯一的目标是减少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>
...你必须查找/root/test/a.txt
所有的Git blob-id,你可以用这样的git命令来做:
git log --format=%H -- /root/test/a.txt | xargs -IcommitId git rev-parse commitId:/root/test/a.txt