当我的分支超过5次提交时,如何在提交中删除过大的文件

时间:2013-11-15 13:48:14

标签: git

我整天都在这个问题上陷入困境,寻找答案:( ...

上下文

我在一个项目上独自工作,直到现在我才使用github来保存我的工作,而不是在我的电脑上。 不幸的是,我在本地存储库中添加了一个非常大的文件:300mb(超过Github的限制)。

我做了什么

我将尝试记录我所做的事情:

  1. 我(愚蠢地)将所有内容添加到索引中:

    git add *
    
  2. 我提交了更改:

    git commit -m "Blablabla"
    
  3. 我试图推送到原始主人

    git push origin master 
    

    花了一段时间,所以我只是CTRL + C,并重复了第4步和第3步,直到我意识到文件太大而无法推送到github。

  4. 我犯了一个可怕的错误就是删除了我的大文件(我不记得我是做了一个git rm还是一个简单的rm)

  5. 我按照(https://help.github.com/articles/remove-sensitive-data

  6. 上的说明操作
  7. 当我尝试git过滤器分支时,我收到以下错误:“无法重写分支:您有未分级的更改。”

  8. 提前致谢!

6 个答案:

答案 0 :(得分:32)

当您删除文件时,这将是一个更改,这是git抱怨的未分级更改。如果您执行git状态,则应该看到列出的文件已删除/删除。要撤消此更改,您应该git checkout -- <filename>。然后文件将返回,您的分支应该是干净的。您还可以git reset --hard这将使您的回购恢复到您提交的状态。

我假设它是最后一个要删除的非常大的文件的提交。您可以执行git reset HEAD~然后您可以重做提交(不添加大文件)。那么你应该能够git push没有问题。

由于该文件不在最后一次提交中,因此您可以毫无问题地执行最终步骤。您只需要提交或删除更改即可。

http://git-scm.com/book/en/Git-Tools-Rewriting-History

答案 1 :(得分:21)

我使用的简单解决方案:

  1. 对于要撤消的提交数量git reset HEAD^,它会保留您的更改和文件的实际状态,只是刷新它们的提交。

  2. 撤消提交后,您可以考虑如何以更好的方式提交文件,例如:删除/忽略大文件,然后添加所需内容然后再次提交。或者使用Git LFS跟踪这些巨大的文件。

答案 2 :(得分:9)

github解决方案非常简洁。在推送之前我做了一些提交,因此很难撤消。 Githubs的解决方案是: 删除旧提交中添加的文件

如果在早期提交中添加了大文件,则需要将其从存储库历史记录中删除。最快的方法是使用BFG(一种比git-filter-branch更快,更简单的替代方法):

bfg --strip-blobs-bigger-than 50M
# Git history will be cleaned - files in your latest commit will *not* be touched

https://help.github.com/articles/working-with-large-files/

https://rtyley.github.io/bfg-repo-cleaner/

答案 3 :(得分:3)

这是参考上面的BFG帖子,我会直接评论,但我不知道如何作为一个声誉不佳的新用户。

你可能想做一个&#39; git gc&#39;先重新包装

在我这样做之前,我遇到了让BFG工作的问题,如果您只是在本地仓库工作并且正在准备第一次放置在遥控器上的东西,这似乎是一个常见的问题。

相关的谷歌搜索引起了我的注意:https://github.com/rtyley/bfg-repo-cleaner/issues/65

答案 4 :(得分:1)

似乎你唯一的问题是没有分期更改。你没有详细说明实际上不同步的内容,所以这是一个黑暗中的镜头,但假设你在步骤4中简单 - rm d文件,你将它从索引中带回来用:

git checkout large_file

如果没有,那就是你自己。您的目标是确保索引和工作树都处于相同状态。这显示为git status报告无需提交,工作目录清理。

确保树木清洁的核选项是git reset --hard。如果您想尝试,请事先备份树+回购。

一旦您的工作副本干净,您就可以继续执行第5步和第6步。

答案 5 :(得分:0)

这对我有用:

  1. 下载并安装here可用的BFG Repo-Cleaner(BFG)。我的下载是bfg-1.13.0.jar
  2. 将下载的jar文件(在我的情况下为bfg-1.13.0.jar移到)的可能有用的位置是$ {JAVA_HOME} / lib。之所以这样做,是因为我希望将Java这样的特定库放在一个比较合理的位置,因为它们不像普通的Windows安装。您可能希望将jar文件重命名为bfg.jar,以使事情变得简单-因此,在下面的示例中,我使用bfg.jar的意思是bfg-1.13.0.jar
  3. 运行java -jar ${JAVA_HOME}/lib/bfg.jar --delete-files <file_name> --no-blob-protection .;您应将整个<file_name>替换为引起问题的特定文件名-请注意,仅文件名本身就不需要文件路径。
  4. 运行git reflog expire --expire=now --all && git gc --prune=now --aggressive以完成BFG清洁作业
  5. 最后,运行git push origin main --force以根据需要完成所有未完成的本地提交。
  6. 如果您成功完成了所有工作,那么问题就解决了
  7. 展望未来,如果要避免再次出现此问题,请始终确保您没有在目录中不小心将非常大的文件添加到Git。