Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用自标记以来的提交数显示git提交_Git - Fatal编程技术网

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

如何使用自标记以来的提交数显示git提交,git,Git,使用git descripe可以获得自上次标记以来的提交次数。如果您只有标签和提交次数,那么显示所描述的提交的最佳方式是什么 我知道您可以使用git log tag..并将其传输到一个执行计数的脚本,但我希望有一个更优雅的解决方案,类似于git show tag~n 为了添加更多上下文,我们计划使用git descripe创建发行号,例如 $ git describe v1.5-39-g5ede964 我们将使用foo_1.5.39。我们想做的是知道1.5.39意味着v1.5标记之后的第39次

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

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

为了添加更多上下文,我们计划使用
git descripe
创建发行号,例如

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

您可以:

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

这将为您提供提交次数

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

例如,鉴于以下回购结构:

a - b - c - d - h
  \           /
    e - f - g
将标签放在
a
上后,
git descripe d
git descripe g
的输出相同,但SHA1除外:

> git describe d
tag-3-ge8dca33
> git describe g
tag-3-g4fecc2e
也就是说,如果没有一组并行分支同时进行,那么您可能能够将给定的提交编号解析回单个提交,但是如果在标记时您甚至有一个活动分支,那么这可能不起作用

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

试试看

git rev-list tag..HEAD --count


它们的意思是一样的。

如果您正在查找自上一个标记以来的提交次数,以下内容对我有用

git rev-list  `git rev-list --tags --no-walk --max-count=1`..HEAD --count
如前所述,这通常是不可能的。为了解决他提到的特殊情况的问题:

也就是说,如果没有一组并行分支同时进行,那么您可能能够将给定的提交编号解析回单个提交,但是如果在标记时您甚至有一个活动分支,那么这可能不起作用

您可以使用以下命令(其中
n
是自标记之后的提交次数)

找到所有提交X的最佳方法是什么?如果
HEAD
指向X
git descripe
将返回
v1.5-39-***

这仍然是一个错误的问题。正确的问题是

如何查找所有提交X,以便如果HEAD指向X,则普通的git descripe可能会返回
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
祖先=v1.5 n=39
git版本列表--全部--反向--拓扑顺序--父级--祖先路径^$祖先\
|awk函数minmore(i){
(i=2;i根[$1])
发电机[$1]=发电机[$i]
return++gen[$1]
}

minmore()这将给出这两次提交之间的提交次数


$git log--oneline 8a3272def6b80e343…e817c08232e65bb1053

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

git rev-list $(git describe --abbrev=0)..HEAD --count

但我想要的是自标记以来的第n次提交,而不是自标记以来的提交次数。基本上与git description相反。不要使用
git log
编写脚本,使用
git rev list
instead@knittl,你能给这个想法再添些细节吗?为什么喜欢
rev list
而不是
log
?我现在的处境是,使用
log
编写脚本似乎是一条必由之路,我希望坚持最佳实践。@UrsReupke:
log
是一个陶瓷命令,它的输出格式可能会随着未来版本的git而改变(例如,随着新的i18n的努力)<代码>版本列表
保证在不同git版本之间保持输出兼容。当然,围绕
log
编写脚本通常更容易:对于快速的一次性脚本或个人脚本,这可能没问题。您可以执行
git show tag~n
来显示该标记之前的第n次提交。也许我误解了什么…我认为从tag开始前进是不可能的。git中的每个提交(初始提交除外)都至少有一个父级,因此您可以通过提交返回。另一方面,此标记的提交(与任何其他提交一样)可能是多个提交的父级,并且它没有对其子级的任何引用,因此您可以从子级移动到父级,而不是从父级移动到子级。@KL-7谢谢,这很有意义。我在我的问题中增加了更多的背景,说明我们正在努力实现什么目标。基于你的观点,父母不提及孩子,我猜这是没有办法的。在这种情况下,如果你加上这个作为答案,我会接受。值得指出的是,在
v1.5-39-g5ede964
中,
g
的意思是,而
5ede964
就是SHA。比这更糟糕。合并后,许多提交必须重新编号,因为提交将以某种方式交错。我将使用Linus Torvalds,并使用
git descripe
输出作为我的版本号。请注意
git rev list--tags--no walk--max count=1
将找到最近的标记,但该标记不一定是HEAD的祖先。它可能来自另一个分支。
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 rev-list $(git describe --abbrev=0)..HEAD --count