如何使用自标记以来的提交次数来显示git commit

时间:2011-12-21 19:44:10

标签: git

使用git describe,您可以获得自上一个标记以来的提交数量。如果您只有标记和提交数量,那么显示所描述的提交的最佳方式是什么?

我知道你可以使用git log tag..并将它传递给一个执行计数的脚本,但我希望有一个类似于git show tag~n的更优雅的解决方案。

要添加更多上下文,我们计划使用git describe创建版本号,例如使用

$ git describe
v1.5-39-g5ede964

我们会使用foo_1.5.39。我们想要做的是知道1.5.39意味着在v1.5标签之后的第39次提交,找到该提交,即找到g5ede964。正如评论中所指出的,v1.5之后的第39次提交可能并不是唯一的。所以也许更好的方式来问这个是什么是找到所有提交X的最佳方法,如果HEAD指向X git describe将返回 v1.5-39-*****

8 个答案:

答案 0 :(得分:26)

尝试

git rev-list tag..HEAD --count

OR

git rev-list tag.. --count

他们的意思相同。

答案 1 :(得分:10)

如果您要查找自上一个标记以来的提交数量,以下内容适用于我

git rev-list  `git rev-list --tags --no-walk --max-count=1`..HEAD --count

答案 2 :(得分:5)

在一般情况下,你所要求的是不可能的。如果您的历史记录中有任何合并,则单独提交的数量无法告诉您。

例如,给定以下repo结构:

a - b - c - d - h
  \           /
    e - f - g

如果标记放在a上,git describe dgit describe g的输出除SHA1外相同:

> git describe d
tag-3-ge8dca33
> git describe g
tag-3-g4fecc2e

也就是说,如果你没有同时进行一堆并行分支,那么你可以将给定的提交号码解析回一次提交,但如果你有一个活动的分支在标签的时间可能不起作用。

如果您需要可靠的版本号,您应该坚持使用明确的标签。

答案 3 :(得分:2)

你可以:

git log --oneline tag.. | wc -l

这将为您提供提交次数

答案 4 :(得分:1)

如果要获取自上一个标记以来的提交次数,请尝试以下操作。

0: {date: "07-04-2020", value: 40}
1: {date: "10-04-2020", value: 20}
3: {date: "14-04-2020", value: 60}

答案 5 :(得分:0)

正如Kevin's answer所解释的那样,这通常是不可能的。为了解决他提到的特殊情况的问题:

  

也就是说,如果你没有同时进行一堆并行分支,那么你可以将给定的提交号码解析回一个提交,但如果你有一个活动的一方在您的标记时分支,那么这可能不起作用。

您可以使用以下命令(n是自标记以来的提交数量)

git rev-list tag..HEAD --reverse | awk NR==n

答案 6 :(得分:0)

  

查找所有提交X的最佳方法是,如果HEAD指向X git describe,则返回v1.5-39-*****

仍然是错误的问题。正确的问题是

  

如何查找所有提交X,以便如果HEAD指向X,则普通git describe 可能已返回 v1.5-39-*****

并不是那么容易回答的问题。但是,如果没有敌人的行动,这个程序将列出正确的提交可能在其他一些可能性中:

ancestor=v1.5 n=39
git rev-list --all --reverse --topo-order --parents --ancestry-path ^$ancestor \
| awk ' function minmore(       i) {
                for ( i=2; i <= NF; ++i )
                        if ( gen[$i] > gen[$1] ) 
                                gen[$1]=gen[$i]
                return ++gen[$1]
        }
        minmore()<=n {
                print "[[ $(git rev-list --count "ancestor".."$1") == "n" ]] &&"
                print "         git describe --match="ancestor" "$1 }
      ' ancestor=$ancestor n=$n \
# | sh    # lose the first `#` here to actually run the generated checks

不确定性和复杂性的原因是git describe只是试图获得合理的基数,所以(见its docs)它会选择最近的最近的当前标签可以看到,并计算在描述的历史记录中有多少额外的提交,并以这种方式生成一个名字。例如,新标签可以更改其首选基础,以便裸git describe不再生成该名称;虽然SHA是不可变的,但可以重写引用。

答案 7 :(得分:0)

这将为您提供两次提交之间的提交次数。

$ git log --oneline 8a32722def6b80e343 ... e817c082323e65bb1053