Git因文件过大而阻止推送,即使该文件已被删除。

3

我在使用git存储库(即通过git命令行工具推送到GitHub存储库)时遇到了问题。

这是一个Rails应用程序。它实现的功能之一是下载.zip文件...这些文件根据设计会在服务器(localhost)上创建并临时存储。问题是自动删除还没有实现。因此,当大小为约120MB的.zip文件在“服务器”上时,我决定git add -Agit commit -m "blabla"git push。推送花费了很长时间,最终以“文件太大,推送中止”的错误消息结束。

那天我放弃了推送,删除了有问题的文件。接下来几天我继续工作,打开了一个新分支,切换回主分支,尝试添加->提交->推送,但是...关于超过大小限制的.zip文件的错误消息仍然存在!

发生了什么?!

请帮帮我!


你是通过HTTP还是SSH/Git进行推送的? - Rufinus
我认为是通过https... 我使用git命令行实用程序。这会如何影响我的问题? - kisa_svnt
根据远程仓库的不同,可能会有推送大小的限制。使用SSH/GIT则没有限制。无论您是使用cli还是gui,这都取决于远程orgin url。请参阅http://git-scm.com/book/en/Git-on-the-Server-The-Protocols以获取更多信息。 - Rufinus
1个回答

4
当你运行git add; git commit时,git将zip文件添加到本地仓库中。即使你删除了本地文件,git仍然在repo中拥有它,因为它保留了每个已提交文件的副本。
由于你已经将文件提交到本地git repo中,你需要在推送之前将其从历史记录中删除。为了做到这一点,请遵循这个答案: https://dev59.com/fXI95IYBdhLWcg3w5iU4#2158271 答案归结为运行git filter-branch,然后删除原始分支。记得用你自己的巨大zip文件的文件名替换giantfile.zip。
$ git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch giantfile.zip' --prune-empty --tag-name-filter cat -- --all
$ git update-ref -d refs/original/refs/heads/master
$ git reflog expire --expire=now --all
$ git gc --prune=now

嘿,magikid,每个答案下面都有一个分享链接。你可以使用它来获取一个最适用于这种情况的答案链接。此外,引用一些答案并对其进行调整以使其更适用于特定情况也不是一个坏主意。 - jamesmortensen
你认为在尝试这个之前创建一个新的分支是最好的,以防万一出了什么问题吗?这会影响整个代码库还是只是单个分支? - jamesmortensen
我上面提供的 git filter-branch 命令将从存储库中的所有分支(和提交)中删除该文件。如果出现问题,git-filter-branch 的文档建议在运行 git update-ref 部分之前备份存储库,或者使用 git clone file:///path/to/repo,因为这将克隆不包含已删除文件的存储库,但您的原始存储库仍将保留在 ref/original/ 中。 - magikid
谢谢!那非常有帮助。 - jamesmortensen

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