如何知道git浅层克隆的深度?

时间:2016-05-12 09:35:02

标签: git git-clone

如果我检索浅色克隆,例如

git clone --depth 10 http://foo.bar/baz.git

git是否有任何命令来检索此克隆的深度? (例如,只打印10)的命令。

1 个答案:

答案 0 :(得分:7)

简答:不。这个数字不存储在任何地方(除非你自己存储 - 如果Git在.git/config某处保存它可能会很好。)

当且仅当文件.git/shallow存在时,存储库才是浅层的(通过Git的内部定义)。这个文件的内容有点偷偷摸摸:大多数Git都以与.git/grafts完全相同的方式处理它。也就是说,shallow文件中的每一行都包含一个提交哈希ID(没有别的,vs grafts,其中每一行都跟着所有嫁接的父ID:因为该行是空的,所以没有父ID,提交成为根提交)。 (Git可以在内部将其标记为“不是真正的根”,表明它具有从未获得的父级。为了完全可靠,这还需要确保没有实际的根提交ID曾经存储在文件中,我不确定是否是这种情况。)

您可以计算所有引用的最大深度:从每个引用开始,计算从最顶端提交到(可能已移植)根的图深度。但是,这不一定是传递给--depth的数字(此处或稍后,--depth赋予git fetch)。

例如,假设我们克隆了一个只有两次提交的存储库,同时也使用了--depth 10。最深的链是一个或两个提交长,因为只有两个提交:一个(真实)根目录,一个提交可能另一个作为其父,或者可能是另一个(真正的)根提交。如果是这种情况我不知道答案 - .git/shallow文件永远不会包含真正的根,那么此时它将是空的,我们会知道,无论条件最长,{{1} }参数必须大于那个,但我们不知道实际的数字。

另一方面,假设我们使用--depth克隆一个10或更多提交的存储库,并获得由伪根移植终止的10个提交链。然后我们向这个10-long链添加两个 new 提交,这样我们就有了一个12-commit链。 --depth 10仍然是10,但计数链,我们找到12。

因此,这显示了计算计数可能太小或太大的两种方式。但是,在许多情况下,计算的计数效果会很好。要获得计算的计数,请使用--depth查找每个参考,并在每个找到的参考上使用git for-each-ref。无论你得到什么最大值,都可能是深度数,或者足够接近的东西。