删除大文件后进行git push

6

我不小心提交了log/test.log文件,但从未推送过它。现在我已经使用git rm命令删除了它。但是当我尝试推送时,仍然会有大量数据尝试传输。难道git rm命令不能解决这个问题吗?如果不能,我该如何解决?

2个回答

11
不要回滚提交并推送,因为大文件仍会在历史记录中传递。假设您尚未推送它,并且要重做的提交是最近的,请从历史记录中删除该提交:
$ git reset HEAD^
这将使您的索引返回到其父提交(HEAD^)上的状态。现在您有了一个重新开始的机会:按照第一次打算的方式添加和提交。
如果您进行了其他后续提交,则需要使用git rebase -i ,其中是错误提交的父SHA-1。例如:
$ git rebase -i 57d0b28
这将进入类似于以下的编辑器中:
pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar
将代码行中"pick"替换为"edit"
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
一旦您对更改感到满意,运行
git rebase --continue

从那里开始,删除有问题的文件(--cached 只会从索引中删除该文件)

$ git rm --cached 大恶文件
rm '大恶文件'

修改提交

$ git commit --amend

完成变基

$ git rebase --continue

你如何获取提交的SHA1地址? - Daniel
@Daniel 执行 git log 或者 gitk 命令,例如。 - Greg Bacon

2
如果您还没有推送,可以使用 git rebase -i 来编辑您的提交历史,删除 addrm。唯一需要注意的是,您必须小心不要编辑已经推送过的提交记录。

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

您问是否可以在提交中进行其他更改以及后续的提交,仍然可以执行此操作。这取决于情况。您应该能够编辑/删除任何未推送的提交,而不仅仅是最近的提交。但是,如果后续更改严重依赖于已删除提交中的更改(例如,您添加了一个文件,然后在后续提交中对其进行了编辑),则重新设置可能会失败。如果您删除提交,则将丢失该提交中的所有更改。我不知道有没有办法从提交中删除单个更改。如果您不想失去test.rb提交中的其他更改,则可以在删除提交之前生成补丁(使用git show <commitid> > /tmp/patch或内置的git patch功能)。然后编辑您的补丁文件以删除大型test.rb,但保留所需的更改,并将补丁重新应用到头部。
如果您遇到我之前提到的重新设置失败的问题(或者认为它会失败),则可以保存所有问题提交后的补丁,将它们全部删除,然后按顺序重新应用它们。

虽然我还没有推送,但是自从那以后我已经提交了几次。重置基底仍然是一个选项吗?(带有意外日志/ test.rb 的提交包含了大量文件) - Daniel

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