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

Posted

技术标签:

【中文标题】从特定路径中删除文件名?【英文标题】:remove filenames from specific path? 【发布时间】:2014-02-04 06:00:36 【问题描述】:

我一直在使用 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 确实比我迄今为止看到的其他方法快 很多...

【问题讨论】:

【参考方案1】:

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

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

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

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

如果/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

【讨论】:

感谢您的更新!我的例子确实是微不足道的,但重点就在眼前!事实是,在某些项目中,路径/文件名不是唯一的。因此,通过路径的最后一点“简单地”清除是不够的。 --strip-blobs-with-ids-method 应该 可以工作...难道不能自动转换为 --strip-by-path ""... 吗? Ohwell :) 无论如何感谢快速工具和快速解决方案! @Roberto Tyley 我已经尝试使用 --strip-blobs-with-ids 使用 "git log --format=%H -- /root/test/a. txt | xargs -IcommitId git rev-parse commitId:/root/test/a.txt" 但我没有工作。 BFG 说“BFG aborting: No refs to update - nodirty commits found??”。谢谢! 如果 BFG 可以针对某些文件夹,那就太好了,因为 filter-branch 可能比需要的复杂得多。单独的“慢”选项会很棒! --strip-blobs-with-ids 根本不适合我。 删除文件夹会删除该文件夹中包含的所有文件,对吗?

以上是关于从特定路径中删除文件名?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 从特定文档目录位置删除所有文件

使用特定方案重命名文件

python从文件中删除特定行

python如何批量对文件夹里所有excel特定行进行删除?

在HDFS上删除某个路径下特定类型的文件,比如class类型文件,比如txt类型文件

使用 sed 从文本文件中删除特定的行号?