Git 正在推送我已删除的文件

PMi*_*lls 2 git github

假设我有一个存储库,在提交 X 的所述存储库中,我尝试上传超过 github 上传限制的视频。因此,考虑到这一点,我在删除该大文件后立即进行了提交。现在是 8 次提交之后,我正在尝试推送我的更改,但是每次我这样做时,git 都会尝试压缩和推送这个 100% 不在我的文件结构中的视频,并且已经提交了。

为什么会这样?有没有办法我可以挑选一个提交并将其从我的 git 历史记录中删除,这样当我推送时,它不会被考虑到推送中,我可以解决这个问题?

axi*_*iac 5

即使大文件不再在您的工作树中,它仍然在存储库中,因为存在包含它的可访问提交。

现在是 8 次提交之后......

假设您在提交时添加了大文件A(过去的8提交)并在提交时将其删除A+1(过去的7提交),您需要修改存储库的历史记录,编辑提交A并从中删除大文件它。如果您在提交A+1时所做的唯一更改是删除大文件,您可以将提交压缩A+1为提交A,这应该可以解决问题。

怎么做

  1. 确保工作树是干净的。提交或隐藏您在工作树中所做的任何更改。此外,如果自有问题的提交以来项目的历史是线性的,则以下内容有效;没有分支或合并。分支或合并提交不会阻止修复存储库,但过程并不那么简单。接下来的步骤假设历史是线性的。
  2. 运行git log --pretty=online并识别添加大文件的提交。实际上,您需要找到此提交的父级。您可以计算在其父项之后创建的提交数量,也可以简单地从git log. 让我们假设你在错误的一次之后做了 8 次提交;错误提交的父项是HEAD~9.
  3. 运行git rebase --interactive HEAD~9(或放置提交的哈希而不是HEAD~9)。
  4. 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)
  5. 验证文件是否以(或至少包含)引入大文件的提交开头。如果没有,则从文件中删除所有内容,保存并退出编辑器。Git将看到文件为空并中止操作。git log仔细检查输出并重新开始。

  6. 如果文件以添加大文件的提交开头(或包含在另一行中),则编辑它后面的行。将edit行首(下一行,包含删除文件的提交的行)替换为fixup. 不要改变其他任何东西!
  7. 保存文件,关闭编辑器,等待Git命令完成。

如果一切顺利,Git成功完成后,会git log显示您删除文件的提交消失了。此外,如果您检查错误提交引入的修改,您会看到大文件也消失了。现在可以推送到 GitHub。

如果 rebase 失败(它不应该),那么您运行git rebase --abortGit恢复您的存储库,使其处于您开始之前的状态。您可以重试或搜索其他解决方案。