关于git:由于我已删除的大文件,无法推送到GitHub

Can't push to GitHub because of large file which I already deleted

目前我有

  • 空Github回购
  • ssh服务器repo(主)
  • 本地回购
  • ssh服务器repo是最新的repo(生产站点),所以我做了一个从那里到本地的git克隆。然后我试着对Github做一个git push

    一切都很顺利,但它说了一些关于filename.gz对于github来说太大的事情。我不需要这个文件,所以我运行了几个git命令从git缓存中删除它,然后将其推回到ssh服务器。

    我在本地看不到这个大文件,但是它仍然在ssh服务器上,即使git diff什么也不返回,git push返回"一切都是最新的"—即使当我试图推到github时在本地repo中看不到该文件,我仍然会得到它的错误。

    remote: error: File fpss.tar.gz is 135.17 MB; this exceeds GitHub's file size limit of 100 MB

    我按照Github帮助中列出的"修复问题"下的步骤进行操作,那么这还不够吗?

    当文件不是本地文件或在git status/diff/push中列出时,该文件如何仍在以太网上?


    你可以用

    1
    git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

    这将删除该文件历史记录中的所有内容。问题是该文件存在于历史记录中。

    这个命令改变了提交的散列值,这可能是一个真正的问题,特别是在共享存储库上。不应在不了解后果的情况下执行。


    如果文件是用您最近的提交添加的,并且您没有推送到Github,那么您可以删除该文件并修改提交,从这里开始:

    1
    2
    3
    4
    5
    6
    7
    8
    git rm --cached giant_file
        # Stage our giant file for removal, but leave it on disk
    git commit --amend -CHEAD
        # Amend the previous commit with your change
        # Simply making a new commit won't work, as you need
        # to remove the file from the unpushed history as well
    git push
        # Push our rewritten, smaller commit


    我发现挤压比filter-branch更有用。我做了以下工作:

  • 本地删除大文件。
  • 提交本地删除。
  • 软重置返回x提交次数(对我来说是3):git reset
    --soft HEAD~3
  • 然后重新提交所有更改(即挤压)git commit -m
    "New message for the combined commit"
  • 推动挤压提交。
  • 特殊情况(来自用户@lituo):如果上面的内容不起作用,那么您可能有这个案例。提交1包括大文件,提交1的推送由于大文件错误而失败。commit 2删除了git rm --cached [file_name]的大文件,但commit2的推送仍然失败。您可以按照上面的相同步骤进行操作,但不要使用HEAD~3,而是使用HEAD~2


    我有一个类似的问题,使用上面的步骤删除文件。它工作得很好。

    然后,我在需要删除的第二个文件上得到一个错误:remote: error: File is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB

    我也试过同样的步骤,但有一个错误:"A previous backup already exists in "

    从这个网站的研究中,我使用了命令:git filter-branch --force --index-filter"git rm --cached --ignore-unmatch " --prune-empty --tag-name-filter cat -- --all

    工作得很好,大文件被删除了。

    令人难以置信的是,这一推仍因另一个错误而失败:error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly

    我通过直接修改.git配置文件-postBuffer = 999999999修复了这个问题。

    在那之后,压力就过去了!


    为什么Github拒绝我的回购协议,即使我删除了大文件?

    Git存储了项目的完整历史记录,因此即使您从项目中"删除"了一个文件,Git repo的历史记录中仍有该文件的副本,并且如果您尝试推送到另一个存储库(如在GitHub上托管的存储库),则Git要求远程repo具有与本地r相同的历史记录。EPO是这样的(即历史上同样的大文件)。

    我怎样才能让Github接受我的回购?

    您需要在本地清理项目的Git历史记录,从所有历史记录中删除不需要的大文件,然后继续只使用"已清理"的历史记录。受影响提交的Git提交ID将更改。

    如何清除Git报告中的大文件?

    从Git历史中清除不需要的大文件的最佳工具是bfg repo cleaner,它是一种比git-filter-branch更简单、更快的替代方案,专门用于从Git历史中删除不需要的文件。

    仔细遵循使用说明,核心部分如下:

    1
    $ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git

    任何大小超过100MB的文件(不在最新提交的文件中)都将从Git存储库的历史记录中删除。然后可以使用git gc清除死区数据:

    1
    $ git gc --prune=now --aggressive

    bfg通常比运行git-filter-branch快至少10-50倍,而且通常更容易使用。

    完全公开:我是bfg repo cleaner的作者。


    如果你在寻求帮助之前就已经把回购协议搞得一团糟,我觉得这是非常有用的。第一种类型:

    1
    git status

    在这之后,你应该看到一些沿着

    1
    2
    3
    4
    5
    On branch master
    Your branch is ahead of 'origin/master' by 2 commits.
      (use"git push" to publish your local commits)

    nothing to commit, working tree clean

    重要的是"两个承诺"!从这里开始,输入:

    1
    git reset HEAD~<HOWEVER MANY COMMITS YOU WERE BEHIND>

    因此,对于上面的示例,可以键入:

    1
    git reset HEAD~2

    键入后,您的"Git状态"应显示:

    1
    2
    3
    4
    On branch master
    Your branch is up to date with 'origin/master'.

    nothing to commit, working tree clean

    从那里,您可以删除大文件(假设您还没有这样做),并且您应该能够在不丢失工作的情况下重新提交所有内容。我知道这不是一个非常花哨的答复,但我希望它能有所帮助!


    我也有同样的问题,所有的答案对我都不起作用。我通过以下步骤解决:

    1。查找哪个提交包含大文件

    1
    git log --all -- 'large_file`

    底部提交是结果列表中最早的提交。

    2。找到最老的那个。

    1
    git log

    假设你有:

    1
    commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

    三。Git钢筋

    1
    git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

    提示:

  • 列表项
  • 我只是选择drop,因为提交包含大文件。
  • 您可能会在重新平衡期间遇到冲突,请修复这些冲突,并使用git rebase --continue继续,直到您完成它。
  • 如果在重新平衡过程中出现任何问题,请使用git rebase --abort取消它。