git tag --contains是如何工作的?

时间:2016-03-27 11:03:48

标签: git

几天前,我一直试图确定哪个版本由标签指定 - 部署了一个特定的修复程序 - 由提交指定。此处的一些帖子发布了git tag --contains是收集此信息的方式,但是the documentation of the option对我来说似乎很模糊:

  

- 包含[commit]:   仅列出包含指定提交的标记(如果未指定,则为HEAD)。

到目前为止,我正在阅读git is just a pointer to a specific commit中的标记,因此不清楚提交引用如何能够包含""另一个提交引用。你知道git tag --contains如何获得它产生的信息吗?

2 个答案:

答案 0 :(得分:1)

当标记包含另一个提交时,表示此提交是其祖先之一。

答案 1 :(得分:1)

  

因此不清楚提交引用如何“包含”另一个提交引用

您可以在git中引入/增强此功能的提交中看到更多内容 参见:

这最初是通过git merge-base完成的,但是:

  

加快--contains计算

     

当我们想知道commit A是否包含commit B(或一组提交中的任何一个,BZ)时,我们通常会计算合并如果B A 的合并基础(或者对于一个集合,如果任何提交BZ具有该属性),则查看基数。< / p>      

当我们要检查一系列提交A1An时,看看每个提交是否包含B(例如,因为我们决定使用“{{1我们做了一系列合并基础计算。这可能非常昂贵,因为我们重复了很多遍历工作。

     

相反,让我们利用这样一个事实:我们将为每个标记使用相同的git tag --contains列表,并且标记提交图的区域肯定包含这些提交,或者肯定不包含这些提交。
  然后,稍后标签可以在看到先前计算后立即停止遍历   答案。

这是通过递归完成的,但是......

commit cbc60b6Jean-Jacques Lafay (DontKnowPS)(2014年4月24日,git 2.1.0-rc0)。{
(由Junio C Hamano -- gitster --合并,2014年4月25日)

  

--contains:避免堆栈溢出

     

在大型repos中,git tag --contains的递归实现可能导致堆栈溢出。用循环替换递归来修复它。

     

这个问题在Windows上比在堆栈上的Linux更明显   默认情况下更受限制。另请参阅this thread on the msysGit list