从特定路径中删除文件名?

Gek*_*kie 16 git-rewrite-history

我一直在玩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真的是很多比迄今为止我见过的其它方法速度快...

Rob*_*ley 26

我是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
Run Code Online (Sandbox Code Playgroud)

  • @Roberto Tyley我试过使用--strip-blobs-with-id使用"git log --format =%H - /root/test/a.txt | xargs -IcommitId git rev-提取id解析commitId:/root/test/a.txt"但我没有工作.BFG说"BFG中止:没有引用更新 - 没有发现脏提交?".谢谢! (2认同)