git,所有分支上的filter-branch

时间:2011-09-15 12:21:21

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

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

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

Why is my git repository so big?

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

3 个答案:

答案 0 :(得分:71)

解决方案很简单:

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>…]

继续阅读,文档的开头说:“通过重写&lt; rev-list options&gt;中提到的分支,在每个修订版上应用自定义过滤器,可以重写git修订历史记录。”

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

  

&LT; rev-list options&gt; ... 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>.

答案 1 :(得分:6)

正如@ ben-lee的回答所解释的那样,重写所有分支都需要--all。如果您的回购中有标记,则需要清除所有那些以及分支,以便获得缩小尺寸的好处,并且需要额外的--tag-name-filter cat咒语。

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

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

...删除所有大于10MB的blob(不在最新提交中),并且可以在所有分支&amp;你的回购中的标签。

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

答案 2 :(得分:3)

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

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

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

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