目前我有
空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中列出时,该文件如何仍在以太网上?
- 该文件仍在历史记录中。您需要销毁历史记录,可能的方法是挤压添加和删除文件的提交。
- @沙巴兹,我按照这个网站上列出的"解决问题"下的步骤……这还不够吗?帮助.github.com/articles/working-with-large-files
- 那里的命令比我对git的了解还要先进,所以我真的说不出来。不管怎样,如果git log -- the_big_file向您返回任何内容,那么该文件仍在历史中。
- @沙巴兹什么也不回<
- 您是否也在推送文件所在的其他分支?另外,如果文件仍在服务器上,为什么git push会说所有内容都是最新的?既然你改变了历史,它应该抱怨说,推动是不可能的,你必须强迫它。
- 没错,这没有道理。只有一个分支主机。远程ssh有master+一个虚拟分支(我创建的目的是为了推送到它的master上)。@沙巴兹
- 如果你有一个终端,在那里你打开了所有这些,如果你粘贴准确的命令和信息(删除个人信息)可能会有所帮助。在你看来,可能有些事情并不重要,但在现实中却是如此。
- 可能会这样做,但这里有一个问题,如果一切都在当前状态下是正常的,我不需要以前的历史。我可以删除git文件夹并在本地重做git init,然后尝试在没有任何问题的情况下推到github吗?@沙巴兹
- 是的,我想我可以这样做@shahbaz stackoverflow.com/questions/9683279/&hellip;
- 如果你的历史对你来说无关紧要,你一定能做到。不过也不太好。您可以做的一件事是专门为GitHub创建一个分支,在一次提交中挤压所有历史记录(实际上与您所说的相同,但不删除其他分支),并且只将该特定分支推送到GitHub。稍后,例如,当master分支中有提交时,您可以选择所有提交并应用于github分支。(不确定合并是否可行,但如果可以,那就更好了)
- 找到了解决方案:czettner.com/2015/07/16/&hellip;
你可以用
1
| git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD |
这将删除该文件历史记录中的所有内容。问题是该文件存在于历史记录中。
这个命令改变了提交的散列值,这可能是一个真正的问题,特别是在共享存储库上。不应在不了解后果的情况下执行。
- 你能解释一下为什么这项工作或指向相关的手册页吗?
- 为我工作,但我不得不"强制"它:git filter branch--index filter"git rm-r--cached--ignore unmatch"-f head
- 杰出的。谢谢!
- 谢谢你!
- 很有帮助。它解决了我的问题。
- 这很管用!谢谢您!
- 这个命令改变了提交的散列值,这可能是一个真正的问题,特别是在共享存储库上。不应在不了解后果的情况下执行。
- 请接受这个答案,因为它确实有效。
- 您是否应该用导致问题的文件名或目录替换?
- 答案是"是的,你是",非常感谢你的回答。
- 请注意,如果要将这些更改应用于所有分支,则需要使用--all标志而不是HEAD标志。
- 在运行命令之后仍然存在问题。这是我的问题链接
- 哇,你救了我一天!非常感谢。这个应该标上"已回答"
- 这是唯一对我有效的解决方案。然后我就可以使用git push origin master,最后删除了repo中过大文件的任何引用。
- 但我收到这样的信息:"警告:参考‘参考/标题/主控形状’不变"
- 我得到:Rewrite 657560fa18c030bcfac9132ce1c3541e84a5bc2c (1/10) (0 seconds passed, remaining 0 predicted) /usr/lib/git-core/git-filter-branch: 1: eval: Syntax error: end of file unexpected。
- 这绝对是不可思议的。我试着从过去三天开始推代码。救了我的命。干杯。
- 小心!只有当您不再需要文件夹/文件时,才运行答案中的命令!我刚刚运行了它,丢失了一个完整的代码文件夹。幸运的是,它备份在远程服务器上。
- 这个非常相似的答案对我来说非常适用:stackoverflow.com/a/45403169/2308190
- 我希望我能投你两次票!
- 我收到错误::"无法重写分支:您有未分页的更改。我试过把一切都安排好,但还是不行。我尝试过很多事情,我问了一个关于使用git-amend的相关问题,但我也不明白stackoverflow.com/questions/48699317/&hellip是如何工作的。
- 您可以编辑您的答案以包含此免责声明:"此命令会更改提交的哈希值,这可能是一个真正的问题,特别是在共享存储库上。在不了解后果的情况下,不应该这样做。"因为这是谷歌解决这个问题的第一个结果,这是最好的答案,如果你这样做,它会完全破坏本地回购协议。我应该在运行这个之前阅读评论,这是我的错,但也许我们可以避免其他人犯同样的错误。
- 注意:对于Windows用户,使用双引号"而不是单引号。
- @我加了一个。
- 太棒了,谢谢@macgyver
- 这一次搞砸了我的回购协议,拉不动也推不动。完全拧紧了。
如果文件是用您最近的提交添加的,并且您没有推送到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 |
号
- 此解决方案将不起作用,因为该文件已不在git索引中(结果是untracked文件列表位于git status处)。
- 什么都没发生。在应用了这个之后,它减少了文件总数,但是在显示了99%的进程之后,它又卡住了。有什么建议我遗漏了什么吗?
- 这对我不起作用。
- Chead是什么意思?
- 如果我想从一个特定的提交中尝试这个——而不是最后一个提交呢?我试过git rm --cached giant_file commit_id,但没用:(
我发现挤压比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。
- 对我来说是有效的,只需在squash push工作之前将三个提交中的更改重新合并到本地存储库中。
- 为什么投反对票?
- 这比最上面的答案好得多。最重要的答案会让你的提交历史一团糟。
我有一个类似的问题,使用上面的步骤删除文件。它工作得很好。
然后,我在需要删除的第二个文件上得到一个错误: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修复了这个问题。
在那之后,压力就过去了!
- 我要处理的另一个问题是删除一个大文件(如上所述),其中一个文件夹中有一个哈希字符。这对正常的git操作根本没有造成任何问题,但是对于git rm,我需要给出文件的完整存储库路径名,并用反斜杠转义该文件以使其正常工作。
- 这对我也很管用。我用一个简单的按钮避开了页面底部的reset hard步。czettner.com/2015/07/16/&hellip;
- 这在运行"git push-f origin"之后也起作用。
为什么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的作者。
- 我的病例有其他并发症,排除了挤压。BFG工具工作得很好。谢谢。
- 这是一个非凡的解决方案
如果你在寻求帮助之前就已经把回购协议搞得一团糟,我觉得这是非常有用的。第一种类型:
在这之后,你应该看到一些沿着
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> |
因此,对于上面的示例,可以键入:
。
键入后,您的"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
| commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32 |
三。Git钢筋
1
| git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32 |
。
提示:
列表项
我只是选择drop,因为提交包含大文件。
您可能会在重新平衡期间遇到冲突,请修复这些冲突,并使用git rebase --continue继续,直到您完成它。
如果在重新平衡过程中出现任何问题,请使用git rebase --abort取消它。