.git中的Objects文件夹对于我的小项目来说非常大

时间:2016-07-16 21:09:10

标签: git github repository

我的git push非常慢,所以我调查并发现文件夹.git/objects占用了大约450MB。

整个项目只有大约6MB,但我添加了140MB大的档案。由于github不允许文件那么大,我删除了它们,然后做了git add -A并尝试再次提交,但是它需要很长时间并且似乎上传了很多。

永远需要:

writing objects:  97% (35/36), 210.17 MiB | 49.00 KiB/s 

如何修复我的git存储库?

1 个答案:

答案 0 :(得分:5)

提交是“永远”

请记住,Git会“永远”保存每次提交(不用担心,这是引用的原因!)。

这意味着当您添加存档并提交时,将其放入,然后当您删除存档并提交时,您会进行另一个提交,即“现在您已经永久保存了这个巨大的存档”,它出自工作版本,因为我们不需要它“......但它仍然在永久审计跟踪中,”每次提交永久“记录。所以它在你的存储库中,你将“必须”推动它。再次注意“必须”的引号。

永远只要你(和其他人都有副本)希望它

请参阅How to remove/delete a large file from commit history in Git repository?您的问题基本上是重复的,但在您去那里的答案之前,请注意您尚未成功推送这些提交,因为GitHub默认说“不,这真的很大。”这意味着您可以自由地使用重写操作:没有其他人拥有您的提交副本。

对于像这样的案例,我通常认为git rebase -i是最简单的清理方法。特别是,假设您在git rebase -i编辑配方中有这一系列的提交:

pick a123456 add feature foo
pick b123456 rm giant file accidentally added in a123456
pick ...

在这种特殊情况下,错误(“添加巨型文件”)和修复(“删除巨型文件”)就在彼此旁边。假设您可以告诉Git:“只需将两个提交合并到一个提交中,即可完成第一次提交然后第二次提交时会发生的情况。”也就是说,让我们做一切,包括添加巨型文件,但在提交之前,让我们也做remove-giant-file,只有然后提交。

嗯,“squash”和“fixup”是告诉Git的两个命令。只需将pick更改为squashfixup即可。它们之间的唯一区别是您是否有机会编辑新组合提交的提交消息:

  • squash:进行组合提交,并在日志消息上显示编辑器,该消息最初包含两个原始日志消息。
  • fixup:进行组合提交,但使用非fixup提交中的日志消息,完全丢弃fixup的消息。

所有历史编辑操作复制提交

正如我们在顶部提到的,提交是永远的。它们无法改变。 rebase的作用(以及链接问题的答案中提到的“BFG”)是 copy 对新的,稍微不同的,更好的(我们希望的)提交的不良提交。然后在复制完成后,我们让Git将错误提交放在一边,并使分支名称指向新副本:

A--B--C--D--E   <-- master

糟糕,提交C很糟糕,我们让D删除了大文件,然后我们也做了无关的修复E。现在我们复制提交C - 通过 - E(我们必须复制E,因为我们必须将所有内容从坏点复制到更新),更好的提交:

     C--D--E   [abandoned]
    /
A--B--C'--E'   <-- master

我们将最初的C-D-E链推开,并使用新的C'C副本D压缩或修复其中)和E'E的副本)并在此情况下将分支名称master指向E'而不是E。现在我们可以推动,或者强迫推动。

如果我们已成功推动,我们必须强制推动。如果我们必须强制推送,这意味着某人 else 可能已经阻止我们的错误C-D-E链,可能使用它和他们也必须恢复。如果他们做错了,他们甚至可能会带回C-D-E! (通常通过合并。)

但如果没有其他人C-D-E,我们可以抛弃它们并知道它们永远不会回来(除非我们去寻找它们)。所以现在我们可以(非强制)推动纠正的C'-E'链。

如果您的修复程序不合适

如果修复错误提交的提交恰好在错误的提交之后,上面的内容很棒:

pick a123456 add feature foo
pick b123456 rm giant file accidentally added in a123456
pick ...

但也许“rm巨型文件”提交不会在错误提交后出现,或者可能还有其他内容混合在一起。如果您可以简单地重新排序提交,以便单独的“rm巨型文件”提交< em>确实在错误之后出现,这很简单,只需按照rebase -i说明进行操作即可。你可以做两个rebase:一个重新排序,一个压缩/修复;或者如果您愿意,可以一次性尝试重新排序和压缩/修复。

如果不是......那么,这就是你想要去filter-branch或另一个(链接)问题中提到的BFG的时候:这些可以在提交时进行复杂的手术。交互式rebase只能单独执行简单的操作,并为您留下复杂的方法(例如,您可以在交互式rebase的中间使用git commit --amend,或者执行多个其他提交。)