在已经被git -rm编辑并推送

时间:2015-04-22 13:51:33

标签: git git-filter-branch

所以我们有一个用户添加,然后在她的工作区中删除一个大的文件目录,它是两个不同的提交。然后,她将更改推送到中央仓库,最终用户看起来像是一个noop。问题是我们的核心仓库因此而增加了50倍。我尝试了几个带过滤器分支的东西,它只是不起作用。

因此添加的文件夹位于根级别。它的名字是.core

我根据链接尝试了以下过滤器分支:

http://www.somethingorothersoft.com/2009/09/08/the-definitive-step-by-step-guide-on-how-to-delete-a-directory-permanently-from-git-on-widnows-for-dumbasses-like-myself/

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

Remove a directory permanently from git

我尝试过的最终命令如下所示:

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch .core" --prune-empty --tag-name-filter cat -- --all
rm -Rf .git/refs/original
rm -Rf .git/refs/logs
git reflog expire --expire=now --all && git gc --prune=now --aggressive

结果输出表示Ref不变。我已经尝试将.core的引用更改为各种变体,例如./.core,* .core / *,.....并且没有删除任何内容。

感谢。

1 个答案:

答案 0 :(得分:3)

使用the BFG,这是git-filter-branch的一种更简单,更快捷的替代方案,专门用于从Git历史记录中删除不需要的文件。

仔细关注BFG' usage instructions - 核心部分就是这样:

$ java -jar bfg.jar  --delete-folders .core  my-repo.git

任何名为.core的文件夹(不在最新提交中)都将从您的Git存储库历史记录中删除。然后,您可以使用git gc清除死数据:

$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

BFG通常比运行git-filter-branch至少10-720x快,并且通常更容易使用。

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