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

Kev*_* W. 219 git github git-push

目前我有

  1. 空GitHub回购
  2. SSH服务器仓库(主)
  3. 本地回购

SSH服务器repo是最新的repo(生产站点)所以我从那里做了一个Git克隆到本地.然后我试着去做git pushGitHub.

一切都很好,但后来它说了一些关于filename.gz对于GitHub来说太大了.我不需要这个文件所以我运行了几个Git命令来从Git缓存中删除它然后推回到SSH服务器.

我没有在本地看到大文件,但它仍然在SSH服务器上,即使没有git diff返回任何内容并且git push返回"Everything is latest-date" - 尽管当我尝试推送时,文件在本地仓库中不可见GitHub我仍然得到它的错误

remote:错误:文件fpss.tar.gz是135.17 MB; 这超过了GitHub的文件大小限制为100 MB

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

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

Mac*_*ver 399

您可以使用

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD
Run Code Online (Sandbox Code Playgroud)

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

此命令更改提交的哈希值,这可能是一个真正的问题,尤其是在共享存储库上.如果不了解后果,就不应该进行.

  • 此命令更改提交的哈希值,这可能是一个真正的问题,尤其是在共享存储库上.如果不了解后果,就不应该进行. (25认同)
  • 为我工作,但我不得不'强制'它:git filter-branch --index-filter'git rm -r --cached --ignore-unmatch <file/dir>'-f HEAD (19认同)
  • 请注意,如果要将这些更改应用于所有分支,则需要使用`--all`标志而不是`HEAD` (11认同)
  • 我得到:`重写657560fa18c030bcfac9132ce1c3541e84a5bc2c(1/10)(0秒过去,剩下0预测)/ usr/lib/git-core/git-filter-branch:1:eval:语法错误:文件结束意外 (8认同)
  • 您是否应该将<file/dir>替换为导致问题的文件或目录的名称? (6认同)
  • 如果你搞砸了,它会毁掉你的整个仓库。请尝试其他选择 (6认同)
  • 我收到错误::"无法重写分支:你有未分阶段的更改.我尝试过暂存所有内容,但它仍然无效.我尝试了很多东西,我已经问了一个关于使用git-amend的相关问题,但我不知道了解它是如何工作的/sf/ask/3408952221/ (3认同)
  • 您可以编辑您的答案以包含以下免责声明:“此命令更改了您提交的哈希值,这可能是一个真正的问题,尤其是在共享存储库上。不应该在不了解后果的情况下执行它。” 因为这是这个问题的第一个谷歌结果,这是最佳答案,如果你这样做,它会完全破坏本地存储库。我应该在运行之前阅读评论,这是我的错,但也许我们可以避免其他人犯同样的错误。 (3认同)
  • 不要在共享存储库上使用它。事实上,根本不要使用这个。 (3认同)
  • 答案是“是的,你是”,非常感谢您的回答。 (2认同)
  • 但是收到此消息“警告:Ref'refs / heads / master'不变” (2认同)
  • 注意!如果您不再需要文件夹/文件,请仅在答案中运行命令!我刚刚运行它并丢失了整个代码文件夹。幸运的是,它已备份到远程服务器上。 (2认同)
  • 这个搞砸了我的回购,不能拉或推。完全搞砸了。 (2认同)
  • 我收到此消息:“致命:不明确的参数‘rm’:未知修订版或路径不在工作树中。”是因为文件被删除了吗? (2认同)

But*_*ass 39

我发现挤压比使用更有用filter-branch.我做了以下事情:

  1. 本地删除大文件.
  2. 提交本地删除.
  3. 提交软重置X号(对我来说是3) git reset --soft HEAD~3.
  4. 然后重新同意所有的变化(AKA壁球) git commit -m "New message for the combined commit"
  5. 推挤压缩提交.

特殊情况(来自用户@lituo):如果上面不起作用,那么你可能有这种情况.提交1包含大文件,并且由于大文件错误,提交1的推送失败.提交2删除了大文件,git rm --cached [file_name]但提交2的推送仍然失败.您可以按照上述步骤操作,但不要使用HEAD~3,请使用HEAD~2.

  • 这是迄今为止修复大型未提交或已提交文件的唯一答案,而无需完全破坏存储库!已投票,因此可以移至顶部:-) (4认同)
  • 这比最佳答案要好得多.最佳答案搞砸了整个提交历史记录. (3认同)
  • 更好是一个强有力的词。这是一个简单的**不同的**解决方案。您应该选择哪一个取决于您想要的结果和/或您当前的状态。 (3认同)
  • 为我工作,只需要在壁球推送工作之前将三个提交的更改重新合并回我的本地存储库。 (2认同)

Blu*_*n93 36

如果文件是使用您最近的提交添加的,并且您尚未推送到GitHub,则可以删除该文件并修改提交,从此处获取:

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
Run Code Online (Sandbox Code Playgroud)

  • -CHEAD是什么意思? (4认同)

小智 24

如果您在寻求帮助之前一直在搞弄仓库,这对我很有帮助。第一类:

git status
Run Code Online (Sandbox Code Playgroud)

之后,您应该会看到类似的内容

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
Run Code Online (Sandbox Code Playgroud)

重要的部分是“ 2次提交”!从这里继续输入:

git reset HEAD~<HOWEVER MANY COMMITS YOU WERE BEHIND>
Run Code Online (Sandbox Code Playgroud)

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

git reset HEAD~2
Run Code Online (Sandbox Code Playgroud)

输入后,您的“ git状态”应显示为:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
Run Code Online (Sandbox Code Playgroud)

从那里,您可以删除大文件(假设您尚未删除),并且您应该能够重新提交所有文件而不会丢失工作。
我知道这不是花哨的答复,但我希望它能有所帮助!

  • 优胜者。简单,干净,有效的git构建解决方案。喜欢这样的答案。 (5认同)

And*_*aal 13

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

然后我在第二个文件上收到错误,我需要删除它: remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB

我尝试了同样的步骤,得到了一个错误: "A previous backup already exists in <path/filename>"

通过本网站的研究,我使用了以下命令:git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --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

在那之后推进了!


Rob*_*ley 10

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

Git存储项目的完整历史记录,因此即使您从项目中删除了一个文件,Git repo仍然会在其历史记录中包含该文件的副本,如果您尝试将其推送到另一个存储库(如GitHub)然后Git 要求远程仓库具有与您的本地仓库相同的历史记录(即其历史记录中的相同大文件).

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

您需要在本地清理项目的Git历史记录,从所有历史记录中删除不需要的大文件,然后仅使用"已清理"的历史记录.受影响的提交的Git提交ID将发生变化.

如何清除Git仓库中的大文件?

从Git历史中清除不需要的大文件的最佳工具是BFG Repo-Cleaner - 它是一种更简单,更快速的替代方案,git-filter-branch专门用于从Git历史中删除不需要的文件.

仔细按照使用说明进行操作,核心部分就是:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git
Run Code Online (Sandbox Code Playgroud)

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

$ git gc --prune=now --aggressive
Run Code Online (Sandbox Code Playgroud)

BFG通常比运行速度快至少10-50git-filter-branch,并且通常更容易使用.

完全披露:我是BFG Repo-Cleaner的作者.


小智 10

我已经尝试了上述所有方法,但没有一个对我有用。

然后我想出了我自己的解决方案。

  1. 首先,您需要一个干净的、最新的本地存储库。删除所有他妈的大文件。

  2. 现在在您的 repo 文件夹之外创建一个新文件夹,并使用“Git create repository here”将其设为新的 Git 存储库,我们将其命名为 new_local_repo。就是这个!以上所有方法都说你必须清理历史......好吧,我厌倦了,让我们创建一个完全没有历史的新仓库!

  3. 将文件从旧的、搞砸的本地仓库复制到新的、漂亮的仓库。请注意,文件夹图标上的绿色徽标将消失,这是有希望的,因为这是一个新的存储库!

  4. 提交到本地分支,然后推送到远程新分支。我们称之为 new_remote_branch。如果你不知道如何从一个新的本地仓库推送,谷歌一下。

  5. 恭喜!您已将干净、最新的代码推送到 GitHub。如果您不再需要远程 master 分支,则可以将 new_remote_branch 设为新的 master 分支。如果你不知道怎么做,谷歌一下。

  6. 最后一步,是时候删除该死的旧本地存储库了。将来您只能使用 new_local_repo。


Wil*_* Hu 5

我遇到了同样的问题,但没有一个答案对我有用。我通过以下步骤解决了:

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

git log --all -- 'large_file`
Run Code Online (Sandbox Code Playgroud)

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

2. 找到最旧的之前的那个。

git log
Run Code Online (Sandbox Code Playgroud)

假设你有:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32
Run Code Online (Sandbox Code Playgroud)

3.Git 变基

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32
Run Code Online (Sandbox Code Playgroud)

尖端

  1. 项目清单
  2. 我只是选择drop提交包含大文件。
  3. 您可能会在变基过程中遇到冲突,修复它们并使用git rebase --continue继续,直到完成为止。
  4. 如果在变基过程中出现任何问题,请使用git rebase --abort取消它。