我们有一个脚本发送电子邮件,其中包含已部署的所有提交的列表。这是通过保持上次部署的日期并在给定时间范围(git log
)内执行now - last deploy time
来完成的。它无法生成由于分支而部署的所有更改的列表的问题。我创建了简约样本来显示问题。我很确定之前曾问过这个问题,但我无法明确表达出来。
* 24d9c49 - (HEAD, master) l-m (Wed Mar 19 15:54:48 2014 +0100) <Andrey>
|\
* \ 0f29219 - r-m (Wed Mar 19 15:54:48 2014 +0100) <Andrey>
|\ \
* | | 73a1f4b - m3 (Wed Mar 19 15:54:48 2014 +0100) <Andrey>
| * | 349c1eb - (right) r1 (Wed Mar 19 15:54:47 2014 +0100) <Andrey>
|/ /
| * 15c190f - (left) l2 (Wed Mar 19 15:54:46 2014 +0100) <Andrey>
| * 50b8c59 - l1 (Wed Mar 19 15:54:45 2014 +0100) <Andrey>
* | da47211 - m2 (Wed Mar 19 15:54:44 2014 +0100) <Andrey>
|/
* 581e3a9 - m1 (Wed Mar 19 15:54:43 2014 +0100) <Andrey>
Here is code to generate given repo.
想象一下我之前部署在15:54:48
,现在我想获得将与当前部署一起部署的提交列表。我这样做:
git log --pretty=format:"%h %s %ad" --since='Wed Mar 19 15:54:48 2014 +0100'
返回:
24d9c49 l-m Wed Mar 19 15:54:48 2014 +0100
0f29219 r-m Wed Mar 19 15:54:48 2014 +0100
73a1f4b m3 Wed Mar 19 15:54:48 2014 +0100
这显然不正确,因为它错过了提交l1,l2和r1,因为它们是在最后一次部署到其他分支之前提交的,但刚刚合并。所以这不只是时间问题。我提出了处理这种情况的算法,但它相当复杂,所以我希望可能有更简单的命令能够生成考虑分支的日志。
更新,解决方案:基于@ user3426575建议我发现我需要这样做:
git log --pretty=format:"%h %s %ad" HEAD ^da47211
其中da47211
在部署之前是最后一次提交。所以我需要在上次部署之前存储最后一个提交号,而不是部署的日期时间。
答案 0 :(得分:2)
您可以指定一个开放的提交范围:
git log --pretty=format:"%h %s %ad" da47211..
man gitrevisions
中解释了这一点:
历史遍历命令(如git log)对一组提交进行操作,而不仅仅是单个提交。对于这些命令,使用上一节中描述的符号指定单个修订版意味着在提交祖先链之后可以从该提交到达的提交集。
要排除提交中可到达的提交,请使用前缀^表示法。例如。 ^ r1 r2表示可以从r2到达的提交,但不包括从r1可到达的提交。
此设置操作经常出现,因此有一个简写。如果你有两个提交r1和r2(根据上面的SPECIFYING REVISIONS中解释的语法命名),你可以要求从r2可以访问的提交,不包括那些可以通过^ r1 r2从r1到达的提交,它可以写成r1。 .r2。
类似的符号r1 ... r2称为r1和r2的对称差,定义为r1 r2 - not $(git merge-base --all r1 r2)。它是一组提交,可以从r1或r2中的任何一个访问,但不能从两者中访问。
在这两个简写中,您可以省略一端并将其默认为HEAD。例如,origin ..是origin..HEAD的简写并询问“自从我从原始分支分叉后我做了什么?”类似地,..origin是HEAD..origin的简写,并询问“自从我分叉后,起源做了什么?”注意......将意味着HEAD..HEAD,它是一个空的范围,既可以从HEAD到达又无法到达。