git,所有分支上的filter-branch

Eog*_*anM 50 git git-filter-branch git-rewrite-history

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

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

为什么我的git存储库这么大?

git filter-branch 似乎只能在当前分支上工作 - 是否有办法立即将其应用于所有分支?

Ben*_*Lee 75

解决方案很简单:

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>…]
Run Code Online (Sandbox Code Playgroud)

阅读,文档的开头说:"让你通过重写<rev-list options>中提到的分支,在每个修订版上应用自定义过滤器来重写git修订历史记录."

所以检查文档rev-list给出:

<rev-list options> ... git rev-list的参数.这些选项包含的所有正面参考都被重写.您还可以指定选项,例如--all,但必须使用 - 将它们与git filter-branch选项分开.

而文档git-rev-list说:

--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
Run Code Online (Sandbox Code Playgroud)

  • 只是为了澄清,通常`filter-branch`最后用`HEAD`列出,` - --all`替换`HEAD` (11认同)
  • 我通过使用管道解决了上述问题(在PowerShell函数中).基本上:`git rev-list --all | git filter-branch [options]`(最后没有rev-list)而不是`git filter-branch [options] - --all`. (2认同)

Rob*_*ley 5

正如@ ben-lee的回答所解释的那样,--all需要重写所有分支.如果您的仓库中有标签,您将需要清理所有这些以及分支,以获得减小尺寸的好处,这将需要额外的--tag-name-filter cat咒语.

虽然问题指定使用git filter-branch,但是提问者想要" 从我的存储库中删除一些大文件和目录 ",所以值得一提的是,实现这一目标的最佳工具实际上是BFG Repo Cleaner,一种更简单,更快速的替代方法git filter-branch.例如:

$ bfg --strip-blobs-bigger-than 10M
Run Code Online (Sandbox Code Playgroud)

...删除大于10MB的所有blob(不在最近的提交中),并且可以处理repo中的所有分支和标记.

完全披露:我是BFG Repo-Cleaner的作者.


Pau*_*sch 5

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

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

git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
Run Code Online (Sandbox Code Playgroud)

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