使用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-*****
。
答案 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 d
和git 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
指向Xgit 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