git-rewrite-history - 从特定路径中删除文件名?

标签 git-rewrite-history

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

IE。
/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 确实比我迄今为止看到的其他方法快很多......

最佳答案

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

清理你的 repo 时的关键问题是:在这两个选项中,你想要实现什么:

  • 减少 Git 存储库大小
  • 删除私有(private)数据

  • 从您的问题来看,听起来您唯一的目标是第一个目标,即减少 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
    

    关于git-rewrite-history - 从特定路径中删除文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142986/

    相关文章:

    Git如何防止公共(public)提交的本地修改

    git - 修改 merge 前 Git 提交的消息

    git - 如何使用 git filter-branch 通过 blob SHA1 删除文件?

    git - 使用 git rewrite 重新格式化整个代码库

    git - 如何将所有 git 提交 merge 为一个?

    git - 我可以在 GitHub pull 请求中更改提交的作者而不影响 `master` 分支的历史记录吗?

    git - git filter-branch 的正确并行化

    git - 如何以非交互方式重新排序 Git 中的提交

    git rebase - 'edit' 和 'reword' 有什么区别

    git - 如何修改现有的、未推送的提交消息?