我能否确定当前提交是否是新分支中的第一个提交

时间:2020-11-11 23:28:13

标签: git branch

我正在尝试强制落实提交消息格式。我希望在新分支中的第一次提交中包含问题#/缺陷#。但是该分支中的后续提交不需要。 我当时想我可以检查父提交是否还有其他孩子,或者父提交是否是除当前分支之外的其他分支的一部分。

我需要在pre-commit挂钩中完成所有这些操作。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您要查询的是当前提交是新分支中的第一个提交:也就是说,此提交是孤立的提交还是回购中的第一个提交。但是,听起来像是要知道您的分支是否与主分支分离(也就是说,它具有主分支没有的承诺),所以我将回答这个问题。我们假设主分支是main

如果您在pre-commit钩子中执行此操作,那么您将对要创建的提交是否是分支上的第一个新提交感​​兴趣。由于当前分支没有与主分支分开的其他提交,因此我们可以编写此代码,如果这是主分支上的第一个分歧提交,则将退出0,否则退出1:

$ [ "$(git merge-base main HEAD)" = "$(git rev-parse HEAD)" ]

询问合并基础(在本例中为最新的公共提交)是否与当前分支相同。

现在,pre-commit挂钩对于帮助开发人员非常有用,但是由于您正在尝试执行策略,因此它们并不是一个好的选择。来自the Git FAQ

进行这些更改的唯一安全位置是通常在pre-receive挂钩或持续集成(CI)系统中的远程存储库(即Git服务器)上。这些是可以有效执行政策的[唯一]位置。

常见问题解答条目详细解释了原因。

因此,由于您将很有可能在CI系统中运行此程序,因此情况将有所不同。您将要知道的是哪个提交是分支中的第一个发散提交,我们可以这样回答:

$ git rev-list main.. | tail -n1

这确定当前分支中不在main中的第一次提交的ID。