Date: Wed, 5 Dec 2007 22:09:12 -0800 (PST)
From: Linus Torvalds <torvalds at linux-foundation dot org>
To: Daniel Berlin <dberlin at dberlin dot org>
cc: David Miller <davem at davemloft dot net>,
ismail at pardus dot org dot tr,
gcc at gcc dot gnu dot org,
git at vger dot kernel dot org
Subject: Re: Git and GCC
In-Reply-To: <4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>
Message-ID: <alpine.LFD.0.9999.0712052132450.13796@woody.linux-foundation.org>
References: <4aca3dc20712051947t5fbbb383ua1727c652eb25d7e@mail.gmail.com>
<20071205.202047.58135920.davem@davemloft.net>
<4aca3dc20712052032n521c344cla07a5df1f2c26cb8@mail.gmail.com>
<20071205.204848.227521641.davem@davemloft.net>
<4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>
2007 年 12 月 6 日星期四,Daniel Berlin 写道:
其实,原来git-gc --aggressive做了这件蠢事
有时打包文件,无论您是否从
SVN repo 与否。
当然。 git --aggressive 大多是愚蠢的。它真的只对
“我知道我有一个真的坏包,我想扔掉
我做过的所有糟糕的包装决定。”
为了解释这一点,值得解释(你可能知道,但是
无论如何,让我了解一下基础知识)git delta-chains 是如何工作的,以及如何
它们与大多数其他系统非常不同。
在其他 SCM 中,delta 链通常是固定的。可能是“前锋”
或“向后”,当您使用存储库时,它可能会有所发展,
但通常它是对单个文件的一系列更改,表示为一些
一种单一的 SCM 实体。在 CVS 中,很明显是*,v 文件,还有很多
的其他系统做类似的事情。
Git 也做 delta-chains,但它做起来更“松散”。那里
不是固定的实体。 Deltas 是针对任何随机的其他版本生成的
git 认为是一个很好的 delta 候选者(有各种相当
成功的启发式),并且绝对没有硬性的分组规则。
这通常是一件非常好的事情。它适用于各种概念
原因(即,git在内部从来没有真正需要关心整体
修订链——它根本不考虑增量),但是
这也很棒,因为摆脱不灵活的增量规则意味着
git 在合并两个文件时完全没有任何问题,
例如——根本没有任意的*,v“修订文件”有
一些隐藏的含义。
这也意味着增量的选择更加开放
题。如果您将增量链限制为仅一个文件,您真的不会
关于如何处理增量有很多选择,但在 git 中,它真的
可能是一个完全不同的问题。
这就是真正糟糕的--aggressive 的用武之地。虽然
git 通常会尝试重用 delta 信息(因为这是个好主意,
并且它不会浪费 CPU 时间重新找到我们找到的所有好的增量
较早),有时你想说“让我们从头开始,留个空白
slate,并忽略所有先前的 delta 信息,并尝试生成
一组新的增量。”
所以--aggressive 并不是真的要咄咄逼人,而是要浪费
CPU 时间重新做我们之前已经做过的决定!
有时这是一件好事。一些导入工具尤其可以
产生非常糟糕的三角洲。任何使用git fast-import的东西,
例如,可能没有很好的 delta 布局,所以它可能
值得说的是“我想从头开始。”
但几乎总是,在其他情况下,这实际上是一件非常糟糕的事情。
这会浪费 CPU 时间,尤其是如果你真的做了一个
早点完成增量工作,最终结果不会重用所有
你已经找到了那些 good 增量,所以你最终会得到一个
更糟糕的最终结果!
我会向 Junio 发送一个补丁来删除 git gc --aggressive
文档。它可能很有用,但通常只有当你
真正深入了解它在做什么,并且
文档并不能帮助您做到这一点。
一般来说,做增量git gc 是正确的方法,而且更好
比做git gc --aggressive。它将重新使用旧的增量,并且
当那些旧的 deltas 找不到时(进行增量 GC 的原因
首先!)它将创建新的。
另一方面,“长
和涉及的历史”是值得花很多钱的地方
是时候找到非常好的增量了。然后,以后的每个用户(如
只要他们不使用git gc --aggressive 撤消它!)将获得
一次性事件的优势。因此,特别是对于具有
历史悠久,可能值得做一些额外的工作,告诉三角洲
寻找疯狂的代码。
所以git gc --aggressive 的等价物——但完成正确——是
做(一夜之间)类似的事情
git repack -a -d --depth=250 --window=250
深度是指 delta 链的深度
(让它们在旧历史中更长——值得开销的空间),和
窗口问题是关于我们希望每个增量有多大的对象窗口
扫描的候选人。
在这里,您可能想要添加 -f 标志(即“全部删除
旧三角洲,”因为您现在实际上是在尝试确保这个
实际上找到了好的候选人。
然后这将需要永远和一天(即,“一夜之间完成”
事物)。但最终的结果是,下游的每个人
存储库将获得更好的包,而无需花费任何精力
自己动手。
Linus