删除大文件后git push

时间:2010-02-24 15:17:23

标签: git

我不小心提交了log / test.log但从未推过它。我已经完成了一个git rm来摆脱它。但是当我尝试推送时,我仍然会收到大量试图传输的数据。不应该git rm解决这个问题。如果没有,我该如何解决?

2 个答案:

答案 0 :(得分:11)

不要还原提交然后推送,因为巨大的文件仍将在历史记录中随身携带。

鉴于您尚未推送它并且您要重做的提交是最新的,请从历史记录中删除该提交:

$ git reset HEAD^

这将使您的索引返回到父提交(HEAD^)所处的状态。现在你有一个重新调整:第一次添加和提交你想要的方式。

如果您已经进行了其他后续提交,则需要git rebase -i <commit>其中<commit>是错误提交的父级的SHA-1。

例如(注意SHA-1在您的回购中会有所不同)

$ git rebase -i 57d0b28

会让你进入一个类似于

的编辑器
pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar

# Rebase 57d0b28..121802a onto 57d0b28
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

使用重度提交

替换pickedit
edit 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar

保存并退出编辑器返回shell,在那里您将看到表单

的消息
Stopped at 366eca1... This has a huge file
You can amend the commit now, with

    git commit --amend

Once you are satisfied with your changes, run

    git rebase --continue

从那里删除有问题的文件(--cached仅从索引中删除文件)

$ git rm --cached big-nasty-file
rm 'big-nasty-file'

修改提交

$ git commit --amend

并完成rebase

$ git rebase --continue

答案 1 :(得分:2)

如果您尚未推送,则可以使用git rebase -i修改提交历史记录,同时删除addrm。需要注意的是,您必须注意不要编辑任何已经推送过的提交。

http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

如果在提交之后有其他更改,那么您是否仍然可以执行此操作。这取决于。您应该能够编辑/删除任何未按下的提交,而不仅仅是最近的提交。但是如果后来的更改严重依赖于已删除提交中的更改(例如,您添加了一个文件,然后在稍后的提交中对其进行了编辑),则rebase可能会失败。如果删除提交,则将丢失该提交中的所有更改。我不知道从提交中删除单个更改的方法。如果您不想丢失test.rb提交中的其他更改,则可以在删除提交之前生成修补程序(使用git show <commitid> > /tmp/patch或内置git patch功能)。然后编辑您的补丁文件以删除大型test.rb,但保留所需的更改,并将补丁重新应用到头部。

如果您遇到我之前提到过rebase失败的问题(或者您认为它会失败),您可以在提交问题后保存提交的所有补丁,删除所有补丁并重新应用他们按顺序。