我们安装了一个自我管理的 gitlab,其中有一个非常简单的 git 预接收钩子,用于检查提交消息格式:
#!
#!/bin/bash
while read oldrev newrev refname; do
if [ "$oldrev" -eq 0 ]; then
#git rev-list $(git for-each-ref --format='%(refname)' refs/heads/* | sed 's/^/\^/') "$newrev";
commits=$(git rev-list $newrev --not --branches=*)
否则
commits=$(git rev-list $oldrev..$newrev)
fi
ticket=false
for commit in $commits; do
message=$(git log --format=%B -n 1 $commit)
if [[ $message =~ ^[Tt]icket\ [0-9]+ ]]; then
ticket=true
break
fi
完成
if !$ticket; then
echo "GL-HOOK-ERR:至少有一次提交的信息必须以 Ticket 开头,后跟空格和票据编号";
退出 1
fi
完成
退出 0
如果我们克隆一个仓库,创建一个新分支,然后推送它,它就能完美运行,但如果我们使用 gitlab 网页界面创建新分支,它就会失败。
我在 gitlab 文档中没有找到任何线索,最终我同意在通过网页界面创建分支时跳过检查,但我该如何检测呢?
问题在于,当通过 GitLab 的 Web 界面创建分支时,不会触发预接收钩子。这是因为 Web 界面通常不进行“推送”操作,而是直接在服务器端创建分支。
因此,无法在预接收钩子中检测到通过 Web 界面创建的分支。
为了解决这个问题,可以考虑以下几种方法:
1. 使用服务器端钩子:
-
GitLab 提供了其他类型的钩子,例如
update
钩子,它们在仓库更新时被触发,包括通过 Web 界面创建分支。可以在
update
钩子中添加类似的提交消息检查逻辑。 - 可以使用 system hooks ,它们在全局范围内对所有仓库生效。
2. 修改工作流程:
- 鼓励开发人员通过命令行创建分支,以便始终触发预接收钩子。
- 在 GitLab 中禁用直接通过 Web 界面创建分支的功能,强制用户使用命令行或合并请求。
3. 放宽提交消息策略:
- 如果经常通过 Web 界面创建分支,可以考虑放宽提交消息策略,例如,只要求在合并到主分支时包含 Ticket 号。
4. 使用 GitLab CI/CD:
- 可以在 GitLab CI/CD 中添加一个作业,用于检查提交消息格式,并在不符合要求时使流水线失败。这种方法更灵活,可以进行更复杂的检查。
最佳解决方案取决于的具体需求和工作流程。如果希望强制执行严格的提交消息策略,则使用服务器端钩子或修改工作流程是更好的选择。如果需要更灵活的解决方案,则可以使用 GitLab CI/CD 进行检查。
标签:bash,git,gitlab,hook From: 78560700