如何计算影响给定子树的git提交数?

如何计算影响给定子树的git提交数?,git,build-process,build-automation,versioning,Git,Build Process,Build Automation,Versioning,我的版本号看起来像0.1.3,有两个组件: 0.1(标签) 3(标记后提交) 所有这些信息都很容易从git descripe--tags中获得 对于0.1.3版git descripe可能如下所示 0.1-3-g53d4dec 所有这些都很好,但我要寻找的是只影响给定子树的提交数量,而不是整个回购协议。如果examples/或test/中的内容发生更改,我不想更改版本号,但如果src/中的内容发生更改,我会这样做 基本上,我正在寻找与git log--relative工作原理相同的git

我的版本号看起来像0.1.3,有两个组件:

  • 0.1(标签)
  • 3(标记后提交)
所有这些信息都很容易从git descripe--tags中获得

对于0.1.3版
git descripe
可能如下所示

0.1-3-g53d4dec
所有这些都很好,但我要寻找的是只影响给定子树的提交数量,而不是整个回购协议。如果
examples/
test/
中的内容发生更改,我不想更改版本号,但如果
src/
中的内容发生更改,我会这样做


基本上,我正在寻找与
git log--relative

工作原理相同的
git descripe--relative src/
,听起来最简单的方法是编写一个简短的脚本-调用git descripe来确定您基于哪个标记,然后执行类似于
git log--pretty=%H$tag$路径| wc-l
来计算提交次数。

我找到了以下方法:

git log $tag.. --pretty=%h --relative $path | wc -l git日志$tag--pretty=%h——相对$path | wc-l 或者更简单:

git log --oneline $tag.. -- $path | wc -l git日志--oneline$tag..--$路径| wc-l 谢谢你们irc://irc.freenode.net/git

我测试过:

git init Initialized empty Git repository in /private/tmp/test/.git/ $ touch a $ git add a $ git commit -m 'first' [master (root-commit) f8529fc] f 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a $ git tag -m 'F' v0.1 $ git tag v0.1 $ mkdir src $ touch src/b $ git add src/b $ git commit [master a5345cd] B 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/b $ git log --oneline $tag.. -- $path | wc -l 1 初始化 已在/private/tmp/test/.Git中初始化空Git存储库/ $touch a $git添加一个 $git提交-m“第一” [master(root提交)f8529fc]f 0个文件已更改,0个插入(+),0个删除(-) 创建模式100644 a $git标签-m'F'v0.1 $git标签 v0.1 $mkdir src $touch src/b $git添加src/b $git提交 [母版a5345cd]B 0个文件已更改,0个插入(+),0个删除(-) 创建模式100644 src/b $git log--oneline$tag..--$路径| wc-l 1.
1在
src/
中的最后一个标记之后提交。没错。

如果您正在编写Git脚本,您应该真正使用“管道”命令而不是“陶瓷”命令(请参阅。在本例中,最有可能的候选命令如下所示


这不正确。我已在问题中添加了示例。将
$tag
更改为
$tag..
以排除标记中包含的所有内容。否则,它将用作起点而不是停止点(您可能希望从开头开始,然后返回到(但不包括)
$tag
)。很抱歉输入错误。是的,正如Chris所建议的,版本列表比日志稍微平滑一些,漂亮的东西被抑制了。当然,您仍然需要描述来确定标记是什么。对,重要的部分是
v0.1..
,它与
v0.1..HEAD
,它与
^v0.1 HEAD
,它是same作为
——不是v0.1 HEAD
。它们都表示HEAD可以访问的所有内容,但从v0.1无法访问。请参阅git rev parse(1)中的“指定修订”
git rev-list --full-history v0.1.. -- src | wc -l