我将一些大二进制文件签入到一个git存储库中。我注意到它变慢了。响应根目录中的git status .最多可达4-5秒。因此,我决定使用git filter-branch --tree-filter "rm -f web/libs/*.*jar" HEAD和类似的命令来清理存储库。但要花上几个小时才能完成。
在运行这些命令时,我仍然可以使用我的存储库吗?
发布于 2014-06-27 08:09:26
不要在过滤器分支期间尝试在存储库中工作。
您可以通过将筛选分支进程发送到shell会话的后台,或者打开另一个终端并继续以这种方式处理您的回购,,但我强烈建议您不要这样做,这样做可能会在回购过程中造成很多问题。。
再说一次,Git可能会在过滤器分支期间锁定某些文件(例如索引),因此如果在筛选分支期间尝试非筛选分支操作,它可能会引发一系列错误。
解决方案1:使用索引过滤器
不要为此使用树过滤器,正如您已经看到的,它非常慢,因为它必须签出每个提交到工作副本中。使用索引过滤器作为在筛选分支文档中推荐。,因为它不需要签出每个提交,因此它运行得更快:
git filter-branch --index-filter '
git rm --cached --ignore-unmatch web/libs/*.*jar
' HEAD您还可以通过将一系列提交传递到HEAD来加快筛选分支,而不是过滤所有提交。例如,下面将过滤最后20或21次提交:
git filter-branch --index-filter '
git rm --cached --ignore-unmatch web/libs/*.*jar
' HEAD~20..HEAD文档
-索引-过滤器 这是用于重写索引的筛选器。它类似于树过滤器,但不检查树,这使得它更快。经常与
git rm --cached --ignore-unmatch ...一起使用,参见下面的示例。关于毛茸茸的案例,请参见git-更新索引(1)。
将
--index-filter与git rm结合使用会产生更快的版本。与使用rm filename一样,如果提交树中没有文件,则git rm --cached filename将失败。如果您想“完全忘记”一个文件,那么它何时进入历史记录并不重要,所以我们还添加了--ignore-unmatch: git过滤器-分支-索引-过滤器‘git rm -缓存-忽略-不匹配的文件名’头。
解决方案2:使用BFG
或者您可以尝试使用BFG工具正如VonC所建议的。
发布于 2014-06-27 10:22:25
速度是你的问题所在,我写BFG是为了更快。而不是几个小时,它几乎肯定会在不到半分钟内完成。
您应该小心地遵循使用说明,但是核心部分就是:
$ java -jar bfg.jar --delete-files *.jar my-repo.git这将删除存储库历史记录中当前在最新提交中未使用的所有jars。
与运行10-50 x相比,BFG通常至少要快于git filter-branch,而且通常更容易使用。如果您决心使用git filter-branch,您可能希望看到这个结果,所以我刚才写了一个关于如何使它运行得更快的答案:https://stackoverflow.com/a/16154016/438886
无论您使用的是git filter-branch还是BFG,您都不应该在历史记录被重写时在存储库上工作--但是,使用BFG时,这段时间只需要几秒钟。
完全披露:我是BFG回购清洁的作者。
https://stackoverflow.com/questions/24446607
复制相似问题