我应该 运行 BFG 在镜像仓库还是原始仓库上?

Am I supposed to run BFG on the mirrored repo or the original?

我想从我的 git 存储库中删除两个不再存在的文件。

我将它们放入、提交并尝试推动,但它们太大了。所以我把它们拿出来,继续工作,然后承诺,试图推动,但它仍然给了我同样的错误。我认为它们仍然存在于某个地方的历史中。

我想我让问题变得更糟了,因为我一直在那个分支工作并且又做了 1 次提交。然后我将该分支合并回主分支。

所以我搜索了解决方案并找到了bfg

但是页面上的说明对我来说没有意义。

首先,

$ git clone --mirror git://example.com/some-big-repo.git

我应该从哪里克隆?我在 github.com 上的远程回购没有我添加大文件后所做的提交和合并。但说明书让我觉得无论如何我都应该从那里得到它。 (我从我的本地仓库克隆。)

接下来,

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

some-big-repo.git是镜像仓库还是普通的本地仓库? (为此我使用了镜像仓库。)

然后我检查了我的历史记录是否已更新并尝试,

$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

(为此我在镜像克隆中)我得到一个错误。

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /home/cole/main_repo
 + 94b9a0d...c7c4317 work -> work (forced update)
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '/home/cole/main_repo'

这对我来说很有意义。是的,我目前确实有 master 签出。但是,我还能做什么呢?如果我尝试另一种方式,我只能看到发生的问题。

您应该 clone/mirror 您最终计划替换提交的回购,但有一个潜在的假设,即这个回购也是一个裸回购。这通常是一个远程仓库,但您也可以克隆一个本地仓库以节省带宽。

潜在的假设是您最终将存储清理后的存储库的存储库是也是一个裸存储库。基于服务器的回购例如GitHub 通常就是这样。

在你的情况下,听起来你已经克隆了一个本地的、非裸的(包含一个 HEAD 和工作副本)repo,要么是为了节省带宽,要么是因为它是包含你希望清理的提交的 repo .无论哪种方式,为了推回一个非裸仓库,你需要确保你没有任何你想要推检出的引用,包括 master。

从您的评论来看,您似乎找到了解决方案,即推回最终的原始回购,这可能是一个裸回购。

BFG 的前 3 个步骤:

  1. 在终端中使用以下命令下载 BFG:brew install bfg
  2. 使用 --mirror 标志克隆您的存储库的新副本。

    git clone --mirror git://example.com/some-big-repo.git
    

    镜像标志允许您制作 Git 数据库的完整副本,而无需实际复制回购文件。

  3. bfg --the-options-you-want the-mirror-repo-you-just-cloned.git

改编自this manual by an IBM engineer。不要像步骤 3 中所说的那样 cd 进入 repo,否则你会得到一个错误 "the-mirror-repo-you-just-cloned.git is not a valid Git repository."