首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在git过滤器分支期间使用我的存储库吗?

我可以在git过滤器分支期间使用我的存储库吗?
EN

Stack Overflow用户
提问于 2014-06-27 07:47:36
回答 2查看 170关注 0票数 0

我将一些大二进制文件签入到一个git存储库中。我注意到它变慢了。响应根目录中的git status .最多可达4-5秒。因此,我决定使用git filter-branch --tree-filter "rm -f web/libs/*.*jar" HEAD和类似的命令来清理存储库。但要花上几个小时才能完成。

在运行这些命令时,我仍然可以使用我的存储库吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-27 08:09:26

不要在过滤器分支期间尝试在存储库中工作。

您可以通过将筛选分支进程发送到shell会话的后台,或者打开另一个终端并继续以这种方式处理您的回购,,但我强烈建议您不要这样做,这样做可能会在回购过程中造成很多问题。

再说一次,Git可能会在过滤器分支期间锁定某些文件(例如索引),因此如果在筛选分支期间尝试非筛选分支操作,它可能会引发一系列错误。

解决方案1:使用索引过滤器

不要为此使用树过滤器,正如您已经看到的,它非常慢,因为它必须签出每个提交到工作副本中。使用索引过滤器作为在筛选分支文档中推荐。,因为它不需要签出每个提交,因此它运行得更快:

代码语言:javascript
复制
git filter-branch --index-filter '
  git rm --cached --ignore-unmatch web/libs/*.*jar
' HEAD

您还可以通过将一系列提交传递到HEAD来加快筛选分支,而不是过滤所有提交。例如,下面将过滤最后20或21次提交:

代码语言:javascript
复制
git filter-branch --index-filter '
  git rm --cached --ignore-unmatch web/libs/*.*jar
' HEAD~20..HEAD

文档

备选方案

-索引-过滤器 这是用于重写索引的筛选器。它类似于树过滤器,但不检查树,这使得它更快。经常与git rm --cached --ignore-unmatch ...一起使用,参见下面的示例。关于毛茸茸的案例,请参见git-更新索引(1)

例句

--index-filtergit rm结合使用会产生更快的版本。与使用rm filename一样,如果提交树中没有文件,则git rm --cached filename将失败。如果您想“完全忘记”一个文件,那么它何时进入历史记录并不重要,所以我们还添加了--ignore-unmatch: git过滤器-分支-索引-过滤器‘git rm -缓存-忽略-不匹配的文件名’头。

解决方案2:使用BFG

或者您可以尝试使用BFG工具正如VonC所建议的

票数 2
EN

Stack Overflow用户

发布于 2014-06-27 10:22:25

速度是你的问题所在,我写BFG是为了更快。而不是几个小时,它几乎肯定会在不到半分钟内完成。

您应该小心地遵循使用说明,但是核心部分就是:

代码语言:javascript
复制
$ 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回购清洁的作者。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24446607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档