2011-09-15 37 views

回答

59

的解决方案是简单的:

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选项>,在每个修订版上应用自定义过滤器。“

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

< REV-列表选项> ...混帐为REV-列表参数。这些选项包含的所有正面参考 都被重写。您也可以指定选项 ,例如 - all,但您必须使用 - 将它们与git filter-branch选项分开。

而对于git-rev-list文档说:

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

只是为了阐明,通常'filter-branch'在最后用'HEAD'列出,' - --all'代替'HEAD' – EoghanM

+0

如何使它在PowerShell(Windows)中工作?它保持错误并显示“filter-branch”的帮助信息。根据Paul的回答,我尝试改为双引号,但我无法在那里找到双引号(请参阅我对答案的评论)。 – ADTC

+2

我通过使用管道解决了上述问题(在PowerShell函数中)。基本上:'git rev-list --all | git filter-branch [options]'(最后没有rev-list)而不是'git filter-branch [options] - --all'。 – ADTC

6

正如@奔 - 李的回答解释说,--all需要重写所有分支。如果您的回购中有标签,您需要清除所有那些以及分支机构,以便获得减小尺寸的好处,并且这将需要额外的--tag-name-filter cat咒语。

虽然问题指定使用git filter-branch,提问要“从我的仓库删掉一些大的文件和目录”,所以它是值得一提的是,最好工具,这样做实际上是The BFG Repo Cleaner,更简单,更快的替代git filter-branch。例如:

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

...删除超过10MB的所有斑点(不在你最新提交),并适用于所有分支标签&在你的回购协议。

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

+1

没问题@EoghanM - 你可能会发现这个演示视频很有趣 - 它是git filter-branch和BFG(运行在Raspberry Pi上)之间的竞赛。http://www.youtube.com/watch?v=Ir4IHzPhJuI –

2

我遵循所有的说明,在我的Windows机器上这样做,但我一直得到一个错误,直到我停止使用单引号并使用双引号代替。

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

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

与目录名称只需更换vagrant,它会从所有分支删除该目录。

+0

有这个问题。谢谢!另外,如果您的命令包含双引号(如'rm -rf“vagrant”''),请使用两个双引号(例如'“rm -rf”“vagrant”“”'')将其转义。 – ADTC

+0

其实这是行不通的。当然,这适用于PowerShell,但'git'只是出错。 – ADTC

+0

在窗户上有一个'git bash'是有原因的。使用它,早晚使用cmd中的git会打你。 – GiM