如何找到
git
中两次提交之间的提交数量?
此外,有什么方法可以让我对 GitHub 上的任何项目执行相同的操作(使用 UI,而不是 API)?
在我给你答案之前,请考虑一下这个提交图:
o -----------
/ \
... - A - o - o - o - B
\ /
o ----- o
每个
o
代表一次提交,A
和B
也是如此(它们只是让我们谈论特定提交的字母)。 提交 A
和 B
之间有多少次提交?
也就是说,在更线性的情况下,只需使用
git rev-list --count A..B
,然后决定“之间”的含义(它是否包括 B 并排除 A?这就是 git rev-list --count
的行为方式)。 在像这样的分支情况下,您将获得所有分支的所有提交;例如,添加 --first-parent
,仅遵循“主线”。
(您还提到了“commitish”,表明我们可能有带注释的标签。这不会影响
git rev-list
的输出,它只计算特定的提交。)
编辑:由于
git rev-list --count A..B
包含提交 B
(同时省略提交 A
),并且您想要排除两个端点,因此需要减去 1。 在现代 shell 中,您可以使用 shell 算术来完成此操作:
count=$(($(git rev-list --count A..B) - 1))
例如:
$ x=$(($(git rev-list --count HEAD~3..HEAD) - 1))
$ echo $x
2
(这个特定的存储库具有非常线性的图形结构,因此这里没有分支,并且在提示“之间”和提示后面的三个提交有两个提交)。 但请注意,如果
A
和 B
标识 same 提交,这将产生 -1:
$ x=$(($(git rev-list --count HEAD..HEAD) - 1))
$ echo $x
-1
所以你可能想先检查一下:
count=$(git rev-list --count $start..$end)
if [ $count -eq 0 ]; then
... possible error: start and end are the same commit ...
else
count=$((count - 1))
fi
$ git log 375a1..58b20 --pretty=oneline | wc -l
指定开始提交,然后指定结束提交,然后计算行数。 这应该是这两个提交范围之间的提交计数。 使用
--pretty=oneline
格式,以便每次提交占用一行。
请注意,使用两个点 (
375a1..58b20
) 与使用三个点 (375a1...58b20
) 不同;请参阅Git 提交范围中双点“..”和三点“...”之间有什么区别?了解有关此内容的更多信息并确定您要使用哪一个。
至于 GitHub 中的 GUI,我不知道有什么方法可以完成同样的任务。 但这应该是微不足道的,因为上面是直接使用 Git 和 Bash 来完成此操作的可能方法。
提交范围可能会在损坏的存储库上失败:
$ git rev-list --count b00aa8ded74..master
error: Could not read 29026cc404895cc9f9afa55c4e2d53b7a4a5a319
fatal: revision walk setup failed
$ git log --oneline b00aa8ded74..master | wc -l
error: Could not read 29026cc404895cc9f9afa55c4e2d53b7a4a5a319
fatal: revision walk setup failed
替代方案:
git log
和grep
depth=$(git log --format=%H $rev2 | grep -m1 -n -x $rev1 | cut -d: -f1)
grep -m1
会在第一场比赛后停止git log
,所以不会有错误