从特定路径中删除文件名?
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 根本不适合我。
删除文件夹会删除该文件夹中包含的所有文件,对吗?以上是关于从特定路径中删除文件名?的主要内容,如果未能解决你的问题,请参考以下文章
python如何批量对文件夹里所有excel特定行进行删除?