6

我想从我的 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检查过了。但是,我还能做什么呢?如果我以另一种方式尝试,我只能看到正在发生的问题。

4

2 回答 2

2

您应该克隆/镜像您最终计划替换提交的存储库,但有一个基本假设是该存储库也是一个裸存储库。这通常是远程仓库,但您也可以克隆本地仓库以节省带宽。

基本假设是您最终将存储已清理存储库的存储库也是一个裸存储库。基于服务器的存储库,例如 GitHub,通常就是这样。

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

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

于 2016-03-04T04:15:49.057 回答
2

BFG 的前 3 个步骤:

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

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

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

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

由 IBM 工程师改编自本手册。不要cd像第 3 步所说的那样进入 repo,否则你会得到一个错误“the-mirror-repo-you-just-cloned.git is not a valid Git repository。”

于 2019-01-22T23:48:58.867 回答