【问题标题】:git, filter-branch on all branchesgit,所有分支上的过滤器分支
【发布时间】:2011-11-17 20:17:45
【问题描述】:

我正在使用以下来源从我的存储库中删除一些大文件和目录:

http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/

Why is my git repository so big?

git filter-branch 似乎只适用于当前分支 - 有没有办法一次将其应用于所有分支?

【问题讨论】:

    标签: git git-filter-branch git-rewrite-history


    【解决方案1】:

    解决方法很简单:

    git filter-branch [options] -- --all

    注意-- --all 中的四个破折号(两组双破折号,中间有一个空格)。

    如果您查看 git-filter-branch 的文档,它会说:

    git filter-branch [--env-filter <command>] [--tree-filter <command>]
        [--index-filter <command>] [--parent-filter <command>]
        [--msg-filter <command>] [--commit-filter <command>]
        [--tag-name-filter <command>] [--subdirectory-filter <directory>]
        [--prune-empty]
        [--original <namespace>] [-d <directory>] [-f | --force]
        [--] [<rev-list options>…]
    

    继续阅读,文档的开头说:“让您通过重写 中提到的分支来重写 git 修订历史,并在每个修订上应用自定义过滤器。”

    因此检查文档中的rev-list 给出:

    … git rev-list 的参数。所有正面参考 这些选项包含的内容被重写。您还可以指定选项 比如--all,但你必须使用--将它们与git分开 过滤器分支选项。

    git-rev-list 的文档说:

    --all
    Pretend as if all the refs in refs/ are listed on the command line as <commit>.
    

    【讨论】:

    • 澄清一下,通常filter-branchHEAD 结尾,` -- --all` 替换HEAD
    • 如何让它在 PowerShell (Windows) 中工作?它不断出错并显示filter-branch 的帮助消息。我已尝试根据 Paul 的回答更改为双引号,但我无法在此处转义双引号(请参阅我的 cmets 答案)。
    • 我通过使用管道(在 PowerShell 函数中)解决了上述问题。基本上:git rev-list --all | git filter-branch [options](最后没有 rev-list)而不是 git filter-branch [options] -- --all
    【解决方案2】:

    正如@ben-lee 的回答所解释的,--all 是重写所有分支所必需的。如果您的 repo 中有 标签,您需要清理所有 标签 以及分支,以获得减小大小的好处,这将需要额外的--tag-name-filter cat 咒语。

    虽然问题指定使用git filter-branch,但提问者希望“从我的存储库中删除一些大文件和目录”,因此值得一提的是最佳工具这样做实际上是 The BFG Repo Cleaner,是 git filter-branch 的更简单、更快的替代方案。例如:

    $ bfg --strip-blobs-bigger-than 10M
    

    ...删除所有大于 10MB 的 blob(不在您的 latest 提交中),并适用于您的 repo 中的 all 分支和标签。

    全面披露:我是 BFG Repo-Cleaner 的作者。

    【讨论】:

    • 没问题@EoghanM - 你可能会觉得这个演示视频很有趣 - 这是 git filter-branch 和 BFG 之间的竞赛(在 Raspberry Pi 上运行...)youtube.com/watch?v=Ir4IHzPhJuI
    【解决方案3】:

    我按照所有说明在我的 Windows 机器上执行此操作,但一直收到错误消息,直到我停止使用单引号并改用双引号。

    我的动机是我不小心检查了我的vagrant 环境。这是从所有分支中删除 vagrant 文件夹的命令:

    git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
    

    只需将vagrant 替换为您的目录名称,它就会从所有分支中删除该目录。

    【讨论】:

    • 有这个问题。谢谢!此外,如果您的命令包含双引号(如 ' rm -rf "vagrant" '),请使用两个双引号(如 " rm -rf ""vagrant"" ")转义它们。
    • 其实这行不通。当然,这适用于 PowerShell,但 git 只会出错。
    • Windows 上有一个 git bash 是有原因的。使用它,从 cmd 使用 git 迟早会打到你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2022-01-09
    • 2014-09-08
    • 2016-12-08
    • 2020-01-14
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多