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

时间:2016-08-16 18:35:43

标签: git github

假设我有一个回购,并且在提交X的回购邮件中,我试图上传一个超过github上传限制的视频。因此,考虑到这一点,我在删除该大文件后立即进行了提交。它现在已经提交了8次提交,我试图推动我的更改,但每次我都这样做,git正在尝试压缩并推送这个100%不在我的文件结构中的视频,并且已经承诺了。

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

1 个答案:

答案 0 :(得分:4)

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

  

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

假设您在提交A(过去的8 th 提交)中添加了大文件,并且您在提交A+1(7 th)中删除了它过去提交)你需要修改你的仓库的历史,编辑提交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 .........
    
  5. 验证文件是否以(或至少包含)引入大文件的提交开头。如果没有,则从文件中删除所有内容,保存并退出编辑器。 Git将看到文件为空并将中止操作。仔细检查git log的输出并重新开始。

  6. 如果文件以添加大文件的提交开始(或在另一行包含它),则编辑其后面的行。将edit替换为行的开头(下一行,即包含删除文件的提交的行)fixup。不要改变别的东西!
  7. 保存文件,关闭编辑器,等待Git完成命令。
  8. 如果一切顺利,Git成功完成后,git log会向您显示删除文件的提交消失。此外,如果您检查错误提交引入的修改,您将看到大文件也消失了。现在可以推送到GitHub。

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