假设我有一个存储库,在提交 X 的所述存储库中,我尝试上传超过 github 上传限制的视频。因此,考虑到这一点,我在删除该大文件后立即进行了提交。现在是 8 次提交之后,我正在尝试推送我的更改,但是每次我这样做时,git 都会尝试压缩和推送这个 100% 不在我的文件结构中的视频,并且已经提交了。
为什么会这样?有没有办法我可以挑选一个提交并将其从我的 git 历史记录中删除,这样当我推送时,它不会被考虑到推送中,我可以解决这个问题?
即使大文件不再在您的工作树中,它仍然在存储库中,因为存在包含它的可访问提交。
现在是 8 次提交之后......
假设您在提交时添加了大文件A(过去的第8次提交)并在提交时将其删除A+1(过去的第7次提交),您需要修改存储库的历史记录,编辑提交A并从中删除大文件它。如果您在提交A+1时所做的唯一更改是删除大文件,您可以将提交压缩A+1为提交A,这应该可以解决问题。
git log --pretty=online并识别添加大文件的提交。实际上,您需要找到此提交的父级。您可以计算在其父项之后创建的提交数量,也可以简单地从git log. 让我们假设你在错误的一次之后做了 8 次提交;错误提交的父项是HEAD~9.git rebase --interactive HEAD~9(或放置提交的哈希而不是HEAD~9)。Git 使用如下所示的文件打开默认编辑器:
pick 1be0057 the commit that adds a big file
pick 766b3e2 removed the big file
pick a1adf78 another commit comment
......... all the other commits until HEAD ...........
# Rebase aa99b12..aff6d45 onto aa99b12 (9 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
......... more lines of explanation here .........
Run Code Online (Sandbox Code Playgroud)验证文件是否以(或至少包含)引入大文件的提交开头。如果没有,则从文件中删除所有内容,保存并退出编辑器。Git将看到文件为空并中止操作。git log仔细检查输出并重新开始。
edit行首(下一行,包含删除文件的提交的行)替换为fixup. 不要改变其他任何东西!Git命令完成。如果一切顺利,Git成功完成后,会git log显示您删除文件的提交消失了。此外,如果您检查错误提交引入的修改,您会看到大文件也消失了。现在可以推送到 GitHub。
如果 rebase 失败(它不应该),那么您运行git rebase --abort并Git恢复您的存储库,使其处于您开始之前的状态。您可以重试或搜索其他解决方案。