由于二进制文件,无法推送到Git

7

最近我在将工作内容推送到主分支时遇到了问题,由于一些二进制视频文件。第一次尝试推送时,这些文件太大了。所以我将它们从我正在处理的项目目录中删除。但是自从我第一次尝试推送以来,每次推送都会返回错误消息。

Compressing objects: 100% (38/38), done.
Writing objects: 100% (39/39), 326.34 MiB | 639.00 KiB/s, done.
Total 39 (delta 16), reused 0 (delta 0)
remote: error: GH001: Large files detected.
remote: error: Trace: b7371dc6457272213ca1f568d9484c49
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File themes/SomeFile/uploads/me_582610_mountain-river.mov is 315.08 MB; this exceeds GitHub's file size limit of 100 MB
To git@github.com:UserName/Project.git

文件太大,但某种方式似乎仍然存在,实际上在我的目录甚至在我的电脑上都不存在。我已经彻底删除了它。问题出在哪里?这是我第一次遇到这种问题。我去参考 Git 网站的支持页面 https://help.github.com/articles/working-with-large-files/ 并运行 git rm --cached me_582610_mountain-river.mov 命令,结果返回 fatal: pathspec 'me_582610_mountain-river.mov' did not match any files
任何帮助将不胜感激!

3
你可能在旧的提交中有这个文件。你需要使用git rebase -igit filter-branch来移除它。在Stack Overflow上有很多相关的例子。 - Andrew C
我最终只运行了 git log 命令找到了添加视频文件的提交记录。复制了提交代码,该代码是一串数字和字母组成的字符串。然后运行了 git reset b876a979bba795150fe7dc8c8089b01eb51e4d71 命令,它完全删除了这些视频文件,并且没有丢失任何其他提交记录中的工作内容。感谢你们的帮助! - bigREDcode
唉,我相信你所做的只是将指针移回到了你大量提交之前的提交。除非你的 .git 文件夹(可能是隐藏的)的大小减少了超过 315MB,否则那个大型二进制 blob 仍然存在于你的仓库中。 - Rich Turner
@RichTurner 我不这么认为。如果是这样的话,我就不能推送了,但我能够推送并且没有任何问题。 - bigREDcode
4个回答

3
请记住,默认情况下,您提交到Git的所有内容都将保留在存储库中 - 即使在以后的提交中“删除”它

GIT(以及其他DVCS)的一个弱点是它不能很好地处理大型二进制文件。许多团队/个人希望对许多大型二进制文件进行版本控制时会更喜欢集中式VCS,例如PerforceSubversion等,这样可以更好地控制下载存储库的哪个部分以及在存储库中保留多少个先前提交的版本。

针对您的问题:您之前提交了一个大型二进制文件到存储库中。即使您随后从存储库中“删除”它,该文件仍然存在。要完全从存储库中删除它,您需要进行一些手术,即物理上破坏添加文件的原始提交,然后重写存储库中每个后续提交!

根据GIT文档关于删除对象的说明重点是我自己添加的):

Git有很多出色的功能,但其中一个可能会引起问题的功能是Git克隆会下载项目的整个历史记录,包括每个文件的每个版本。如果整个项目都是源代码,则这没有问题,因为Git高度优化以有效地压缩该数据。然而,如果在您的项目历史记录中的任何时刻有人添加了一个巨大的文件,则所有时间的所有克隆都将不得不下载该大文件,即使它在接下来的提交中被删除

解决您的问题并不是一个简单的过程,它具有破坏性(因为它基本上会重写添加有问题文件的提交之后的每个提交),并且在上面的链接中有详细文档,我建议您仔细阅读并在本地副本上进行几次练习,然后再更新正式的存储库。

请小心操作!

如果你在导入后立即执行此操作,而没有人已经开始依赖于该提交的工作,那么你就没问题了 - 否则,你必须通知所有贡献者他们必须将他们的工作变基到你的新提交上。

坦白地说,当我约一年前遇到自己的存储库(即没有与任何其他人共享)时,我选择将当前代码库复制到一个新文件夹中,并从中创建一个新的GIT存储库,而不是尝试重写我的所有历史记录、打包文件等。对我来说,失去历史记录并不是一个重要的问题。

祝好运!


如果你所说的是真的,那么如果在我添加实际视频文件之后我有4个提交,则我将失去在添加这些视频文件后提交的所有工作? - bigREDcode
不,这只意味着您必须销毁在您的版本库中存储大文件的原始操作,然后重写您之后进行的每个4次提交的历史记录。 - Rich Turner

1

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD

git filter-branch --tree-filter 'rm -rf 路径/到/你的/文件' HEAD


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jeffrey Bosboom

1
这个最不可怕的技巧对我总是有效的 ->
  1. 找出你在这个项目中修改了哪些文件(git status)
  2. 备份你当前的克隆目录
  3. 删除克隆项目
  4. 创建一个新的克隆
  5. 将修改过的文件复制到新克隆的目录中

然后进行 git commit 和 git push,你就完成了。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接