gitlab社区版本不能在直接后台设置git的一些提交限制,比如限制邮箱的校验等,所以就只能单独仓库设置钩子文件,并批量的放置在所有的仓库下。
按理由,基于钩子文件可以做很多限制。
查看项目库路径
使用控制台获取项目被加密的项目库路径
gitlab-rails console
project = Project.find_by_full_path('techcenter/saas/commonapi')
puts project.disk_path
设置钩子
pre-receive
钩子文件
1. 创建文件#!/bin/bash
RED='\033[0;31m' # 定义红色
NC='\033[0m' # 无色(用于重置颜色)
while read oldrev newrev refname; do
# 检查是否是删除分支的操作
if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then
# 允许删除分支操作
echo "分支删除操作被允许"
continue
fi
author_email=$(git log -1 --pretty=format:"%ae" $newrev)
if [[ ! $author_email =~ ^[a-zA-Z0-9._%+-]+@example\.cn$ ]]; then
echo -e "\n\n${RED}提交被拒绝,因为提交邮箱不符合规定。请使用公司邮箱${NC}"
echo -e "${RED}git config --global user.name '你的名字'${NC}"
echo -e "${RED}git config --global user.email '公司邮箱'${NC}\n\n"
exit 1
fi
done
+x
2. 赋予权限chmod +x pre-receive
# 可能得话 还需要分配用户组
chown -R git:git custom_hooks
3.设置批量给项目设置钩子的脚本
#!/bin/bash
# 钩子脚本的通用位置
global_hook_path="/opt/gitlab-global-hooks/pre-receive"
# GitLab仓库的根目录
repo_root="/data/gitdata/repositories/@hashed" # 此目录按实际目录
# 遍历所有.git仓库目录
find "$repo_root" -type d -name "*.git" | while read repo; do
# 定义custom_hooks目录路径
custom_hooks_dir="$repo/custom_hooks"
# 定义将要创建的软连接的目标路径
hook_symlink_path="$custom_hooks_dir/pre-receive"
# 检查custom_hooks目录是否存在,不存在则创建
[ ! -d "$custom_hooks_dir" ] && mkdir -p "$custom_hooks_dir" && chown git:git "$custom_hooks_dir"
# 检查钩子软连接(或文件)是否已经存在
if [ ! -e "$hook_symlink_path" ]; then
# 创建软连接
ln -s "$global_hook_path" "$hook_symlink_path"
echo "Created symlink for $hook_symlink_path"
else
echo "Hook already exists for $repo, skipping..."
fi
done