我正在共享主机上托管一个git repo.我的repo必然有几个非常大的文件,每次我尝试在repo上运行"git gc"时,我的进程被共享主机提供程序杀死,因为使用了太多内存.有没有办法限制git gc可以消耗的内存量?我希望它可以交换内存使用速度,只需要花一点时间来完成它的工作.
我们有一个相当大的git仓库(ios app资源).我很欣赏git在使用它时会很慢,但如果我创建一个新分支并编辑几个文件(不是二进制文件)并推送,则需要永远.
感觉整个回购都被推了.我的印象是git只会发送差异,是不是错了?(我知道git存储整个文件的压缩版本,我的意思是我的分支和我从哪里分支的差异).
如果我运行,git diff --stat --cached origin/foo那么我会看到一个简短的文件列表,看起来像我期望的那样,例如34 files changed, 1117 insertions(+), 72 deletions(-).但当我推动它进入Writing objects: 21% (2317/10804)并停止时,好像它正在推动所有2.4GB的二进制数据.
我错过了什么(我用Google搜索了很多)?这是预期的行为吗?我在OS X(Mavericks)和ssh(git@github.com)上使用git 2.2.2.
我在这里发现了一个类似的问题:Git - 推动一个大项目的远程分支是非常缓慢但没有真正的答案.
在SO和其他地方以各种形式提出了这个问题,但是我找不到能使我满意的答案,因为没有人列出有问题/没有问题的动作/命令,也没有对速度下降的技术原因进行透彻的解释。 。
例如:
因此,我不得不再次问:
和,
我现在不在乎如何解决这个问题。我只关心哪个动作的性能受到影响,以及根据当前git架构的推理。
编辑以澄清:
很明显,git clone例如,将是回购规模的o(n)。
但是我不清楚这是git pull一样的,因为从理论上讲只看差异是可能的。
Git在幕后做了一些非常琐碎的事情,我不确定何时何地。
编辑2:
我发现这篇文章,说
如果您的存储库中有大型不可分散的文件(例如二进制文件),则每次对文件进行更改时,都将在该存储库中保留该文件的完整副本。如果您的存储库中存在这些文件的许多版本,则它们将大大增加签出,分支, 获取和克隆代码的时间。
我不明白为什么分支需要花费超过O(1)的时间,而且我也不确定列表是否已满。(例如,拉动怎么样?)