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

10

我的 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个回答

11

提交记录是“永远”的

请记住,Git 会将每一个提交记录都保存“永远”(不用担心,这里加引号是有原因的!)。

这意味着当您添加归档并进行提交时,您已经将其放入其中,然后当您删除归档并提交时,您又增加了一次提交记录,该提交记录表示“现在您已经永久地保存了这个巨大的归档文件,请将其从工作版本中取出,因为我们不需要它”...但它仍然在永久审计跟踪记录中,“每个提交记录永远”。 因此,它在您的存储库中,并且您将“必须”将其推送。再次注意“必须”周围的引号。

“永远”只有您(以及所有其他拥有副本的人)想要的那么长

请参阅如何从Git存储库的提交历史记录中删除/删除大型文件?。 您的问题基本上是一个重复的问题,但在您查看答案之前,请注意,您还没有成功地推送这些提交记录,因为GitHub默认说“不,这真的很大”。 这意味着您可以自由使用重写操作:没有其他人拥有您的提交记录副本。

对于像这种情况,我通常认为git rebase -i是清理最简单的方法。 特别是,假设您在git rebase -i编辑接受时有此序列的提交记录:

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

在这种情况下,错误(“添加巨大文件”)和修复(“移除巨大文件”)就挨在一起。假设你可以告诉 Git:“将这两个提交合并为一个提交,它做的事情与您先执行第一个提交然后再执行第二个提交的结果相同”。也就是说,让我们包括添加巨大文件在内的所有操作,但在提交之前,还要执行删除巨大文件操作,并且只有在此之后才提交。

好吧,“Squash”和“Fixup”正是告诉 Git 如何做到。只需将 pick 更改为 squashfixup 即可。它们之间唯一的区别是是否有机会编辑新组合提交的提交消息:

  • squash:创建一个组合提交,并在日志消息上打开编辑器,该消息最初包含原始日志消息。
  • fixup:创建一个组合提交,但使用非 fixup 提交的日志消息,完全放弃 fixup 的消息。

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

正如我们在开头提到的,提交是永久的。它们无法更改。Rebase 做的事情(以及链接问题答案中提到的“BFG”)是将不良提交复制到新的、略有不同的、更好(希望如此)的提交中。然后在复制完成后,我们让 Git 推开不良提交并使分支名称指向新副本:

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

糟糕,提交C有问题,我们制作了D来删除大文件,然后我们也进行了不相关的修复E。所以现在我们要复制从提交CE的所有内容(因为我们必须从错误点开始复制),并将其复制到更新、更好的提交中:

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

我们将原来的 C-D-E 链路移出,使用我们新的 C'C 的一个副本,其中 D 已经被压缩或修复到其中),和 E'E 的一个副本),并将分支名 master 指向 E' 而不是 E。现在我们可以推送,或者强制推送。

如果我们已经成功推送了,那么我们就必须进行强制推送。如果我们需要强制推送,这意味着其他人可能已经卡住了我们的问题 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 giant file”提交并不紧随错误提交,或者它混有其他东西。如果您可以简单地重新排序提交,以便一个孤立的“rm giant file”提交紧随错误,那很容易,只需按照“rebase -i”说明操作即可。您可以执行两次rebase:一次用于重新排序,一次用于压缩/修复;或者,如果您喜欢,可以尝试一次重排和压缩/修复。

如果不行...好吧,这时候您可能需要使用filter-branch或在另一个(链接)问题中提到的BFG:它们可以对提交进行复杂的手术。交互式变基仅自行执行简单操作,并将复杂方法留给您处理(例如,在交互式变基过程中使用git commit --amend,或执行多个附加提交)。


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