我可以判断当前提交是否是新分支中的第一个提交吗

Can I tell if the current commit is the first commit in a new branch

我正在尝试强制执行提交消息格式。我希望在新分支中的第一次提交包含问题#/defect #。但是该分支中的后续提交不需要。 我在想我可以检查 parent 提交是否有其他 children,或者 parent 提交是否是当前分支之外的其他分支的一部分。

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

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

如果您在 pre-commit 挂钩中执行此操作,那么您会对要创建的提交是否是分支上的第一个新提交感​​兴趣。由于当前分支没有从主分支发散的额外提交,我们可以这样写,如果这是主分支上的第一个发散提交,它将退出 0,否则退出 1:

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

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

现在,pre-commit 挂钩非常适合帮助开发人员,但由于您要强制执行策略,因此它们不是一个好的选择。来自 the Git FAQ:

The only safe place to make these changes is on the remote repository (i.e., the Git server), usually in the pre-receive hook or in a continuous integration (CI) system. These are the [only] locations in which policy can be enforced effectively.

FAQ 条目更详细地解释了原因。

因此,由于您很可能会在 CI 系统中成为 运行,因此情况会有所不同。你想知道的是 哪个提交是分支中的第一个分歧提交,我们可以这样回答:

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

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