繁体   English   中英

如何使用 BFG Repo-Cleaner

[英]How to use BFG Repo-Cleaner

有人建议我使用 BFG Repo-Cleaner 作为我要推送的本地存储库,其中包含太大而无法推送到 GitHub 的文件。 这些文件(大约 50MB 以上)我不介意它们是否被删除并且我不小心将它们提交了一段时间。

网上说明: https://rtyley.github.io/bfg-repo-cleaner/

它建议我应该使用 --mirror 标志克隆我的 repo 的新副本(这似乎是一个在线版本,而不是本地版本)。 然后执行 Java -jar bfg.jar... 命令。 然后按照 cd 回到在线 repo 的本地镜像副本,然后将信息推送回来。

我不太明白这如何适用于本地副本。 对于太大而无法推送的本地副本,我应该这样做:

git 克隆 --mirror /Users/me/myrepo

java -jar bfg.jar --strip-blobs-big-than 100M /Users/me/myrepomirror.ZBA9F11ECC3497D9993Z533FDC2BD6E

然后我也不明白接下来的步骤如何:

cd /Users/me/myrepomirror.git git reflog expire --expire=now --all && git gc --prune=now --aggressive git push

将解决与我的非镜像本地存储库有关的任何问题:

/用户/我/myrepo

我不确定他们是否暗示我应该在此之后做:

java -jar bfg.jar --strip-blobs-big-than 50M my-repo.git

而且我不知道这如何解决我想要修剪的实际回购(不是镜像或在线版本)以便我可以推送它。

也许我有点沉闷? 对于可能有用的东西,该文档似乎不是很明确/广泛。 这里的任何帮助都会很棒。 谢谢!

我以前从未使用过 BFG。 如果您处于需要删除大文件的情况,这听起来很有用。 但是,我将尝试解释整个过程,据我所知。

在我们开始之前,请注意 BFG 将重写远程存储库的历史记录,并且推送它将需要您团队中的每个人重新克隆存储库并将其仅本地分支转移过来。

根据git的文档, git clone --mirror

设置源存储库的镜像。 这意味着 --bare。 与 --bare 相比,--mirror 不仅将源的本地分支映射到目标的本地分支,它还映射所有 refs(包括远程跟踪分支、注释等)并设置 refspec 配置,以便所有这些 refs被目标存储库中的 git 远程更新覆盖。

这意味着克隆将在您的计算机上创建远程存储库的精确副本。 正如 BFG 文档所说,您应该创建此克隆的备份,以备日后需要。

java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git

将针对您使用git clone --mirror制作的克隆,并将清除包含 > 100M 的文件的所有提交,除了最近的提交(如 BFG 文档中所述)。 BFG 不会自动删除旧数据。 它会停止,让您确认一切正常,然后让您清理 rest。

cd /Users/me/myrepomirror.git 

将导航到裸存储库。 您可能必须相应地更改路径。

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

让我们将此命令分解为两个逻辑部分:

  1. git reflog expire --expire=now --all
    • expire 子命令将修剪旧的 reflog 条目。 reflog 是 HEAD 指向的 refs 的日志。 --expire=now告诉 git 在当前时间之前使所有 reflogs 过期。
    • --all表示所有引用。 如果没有 --all,过期只会发生在您当前所在的分支上,而不是所有分支上。
  2. git gc --prune=now --aggressive
    • git gc 处理 git 的垃圾收集。 通常,它会在后台自行运行,但有时能够运行它很有用。
    • --prune=now告诉 git gc 在当前时间之前删除松散的对象。
    • --aggressive将导致 git gc 花费更多时间清理不必要文件的存储库并提供更大的优化。 git gc文档有一些额外的信息。

完成所有这些后, git push将用新清理的分支覆盖所有分支的远程版本。

您现在必须使用git clone在不同的目录中重新克隆存储库以获得非裸版本。

本质上,我们在这个过程中所做的是创建远程存储库的副本,删除有问题的文件并重写该过程中的提交历史,推送重写的远程并覆盖之前的内容,并克隆该存储库的新副本让我们继续工作。

预防措施

我建议采取一些预防措施,以避免不得不不断删除这些文件。 BFG不应该经常运行,因为它会重写存储库的历史记录。

不幸的是,.gitignore 不支持忽略大于给定大小的文件。 但是,无论如何,您可能有一些可用的选项。

  1. 如果所有这些大文件都具有特定的文件扩展名或位于特定目录中,只需将它们添加到 .gitignore 文件中即可防止 git 跟踪它们。
  2. 创建一个预提交挂钩,以防止添加超过一定大小的文件。 似乎有一个脚本(我没有测试过)来响应这个 SO post
    • 这是一个客户端 gitook,这意味着它需要分发给您团队中的其他开发人员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM