git,在所有分支上过滤分支

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

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

为什么我的git仓库如此之大?

git filter-branch似乎只能在当前分支上工作 – 有没有办法一次把它应用到所有分支?

解决scheme很简单:

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

注意四个破折号(两组双破折号之间有一个空格)in -- --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>…] 

阅读文档的开头部分说:“通过重写<rev-list选项>中提到的分支,在每个修订版上应用自定义filter,可以重写git修订历史logging。

所以检查文档的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>. 

正如@ ben-lee的答案所解释的,所有的分支都需要重写。 如果你的代码库中有标签 ,你会想要清除所有这些以及分支,为了获得缩小的好处,这将需要额外的 – --tag-name-filter cat咒语。

虽然问题指定使用git filter-branch ,但是提问者希望“ 从我的仓库中清除一些大的文件和目录 ”,所以值得一提的是最好的工具实际上是BFG Repo Cleaner ,它是一个更简单, git filter-branch 。 例如:

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

…删除所有大于10MB的斑点(不在您最近的提交中),并在您的仓库中的所有分支和标签上运行。

充分披露:我是BFG Repo-Cleaner的作者。

我遵循所有的指示,在我的Windows机器上这样做,但我一直得到一个错误,直到我停止使用单引号,而是使用双引号。

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

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

只要用你的目录名replacevagrant ,它会从所有分支中删除这个目录。