当前位置: 首页 > news >正文

Git+SSH 实现控制分支的提交权限

        由于历史的原因,没有引入gitlab,gitea等平台来管理代码,仅使用Git+SSH来实现代码仓库的功能。

        现在我们有个需求是能控制分支的提交权限,在网上搜索一顿之后,发现可以依靠Git自带的HOOK机制来实现。当然,也可以引入前述的平台,功能更强大,但考虑到部署成本的原因,决定先解决当下的需求,用自带的就行了。

        以下是实现方法:

        1、找到git仓库的目录,比如:/home/git/repo/test

        2、在test目录下,有个hooks 目录,大概是这样子的:

进入hooks目录,创建名为pre-receive的文件,然后输入以下内容:

#!/bin/bash# ================== 配置区:修改这里 ==================
# 受保护的分支列表(支持精确匹配和正则)
PROTECTED_BRANCHES=("refs/heads/main"                    # 精确:main"refs/heads/dev"                     # 精确:dev"refs/heads/release/.*"              # 正则:所有 release/* 分支"refs/heads/hotfix/.*"               # 正则:所有 hotfix/* 分支
)# 每个分支的允许用户(格式:分支名=用户1,用户2,...)
# 注意:分支名用短名(如 "main"),正则分支用 "release/.*"
declare -A BRANCH_ALLOWED_USERS=(["main"]="admin,alice"               # main 只允许 admin 和 alice["dev"]="admin,bob"                  # dev 只允许 admin 和 bob["release/.*"]="admin"               # release/* 只允许 admin["hotfix/.*"]="admin,bob"            # hotfix/* 只允许 admin 和 bob
)
# =====================================================# 当前 push 用户(从 SSH authorized_keys 的 environment="GITUSER=xxx" 获取)
PUSH_USER="${GITUSER:-unknown}"# 读取每个 ref 更新(oldrev newrev refname)
while read oldrev newrev refname; do# 只处理分支(忽略 tag)if [[ $refname == refs/heads/* ]]; thenbranch_short="${refname#refs/heads/}"  # 提取短分支名,如 "main"# 检查是否是受保护分支is_protected=0for protected in "${PROTECTED_BRANCHES[@]}"; doprotected_short="${protected#refs/heads/}"  # 提取短名# 正则匹配(包含 .* 或 * 等)if [[ $protected_short == *.* || $protected_short == *[* || $protected_short == *^ || $protected_short == *\$ ]]; then# 用正则匹配短分支名if [[ $branch_short =~ ^${protected_short}$ ]]; thenis_protected=1breakfielse# 精确匹配if [ "$refname" = "$protected" ]; thenis_protected=1breakfifidone# 如果是受保护分支,检查用户权限if [ $is_protected -eq 1 ]; thenallowed_users="${BRANCH_ALLOWED_USERS[$protected_short]}"if [ -n "$allowed_users" ]; then# 检查用户是否在允许列表IFS=',' read -ra user_list <<< "$allowed_users"is_allowed=0for allowed in "${user_list[@]}"; doif [ "$PUSH_USER" = "$allowed" ]; thenis_allowed=1breakfidoneif [ $is_allowed -eq 0 ]; thenecho "========================================"echo "ERROR: 用户 '$PUSH_USER' 禁止 push 到分支: $branch_short"echo "允许用户: $allowed_users"echo "请联系管理员或使用其他分支。"echo "========================================"exit 1fielse# 如果没定义用户,默认禁止所有echo "========================================"echo "ERROR: 分支 '$branch_short' 已完全锁定,禁止所有用户 push"echo "========================================"exit 1fififi
done# 所有检查通过
exit 0

        3、修改pre-receive文件的权限,增加可执行权限:

chmod +x pre-receive

无需重启任何组件和系统,就可以生效了。因此,如果想修改分支或者是用户,可随时进行修改。        

        以上是增加控制的方法,那么,如何解除控制呢,有2种办法:

        1、修改pre-receive文件名,比如改成pre-receive.bk。

        2、直接屏蔽代码,比如,不想某个分支被控制,则在那个定义分支数组的PROTECTED_BRANCHES,在指定的分支前加上#,表示注释改行。

        3、修改用户也是类似的方法。

如果有多个项目,那就需要在每个项目的hooks目录下,部署pre-receive文件。这么对比起来,操作性和便利性确实不如引入第三方平台。

http://www.dtcms.com/a/569149.html

相关文章:

  • 网站建设选择题网站的内容建设
  • 怎么用自己电脑做网站服务器刚做淘客没有网站
  • CUDA C++编程指南(3.1)——使用NVCC编译
  • Numpy学习总结
  • 可梦AI获首批企业好评,蜜糖网络入驻共启AI短剧工业化
  • 笔记跨设备无缝切换?Joplin+cpolar让多设备同步更自由
  • Swift 6.2 列传(第四篇):enumerated () 的 “集合神功”
  • PDF 全文翻译开发实现思路:挑战、细节与工程化解决方案
  • 算法解析:从杨辉三角到几何查询的编程实践
  • 数学基础---刚体变换(旋转矩阵与平移矩阵)
  • 找别人建网站去哪里设计网址合集
  • 宁波网站建设费用wordpress启用注册
  • 我的第一个开源项目IOT-Tree Server-实际项目使用介绍
  • 蓝牙钥匙 第41次 紧急情况处理场景下的汽车数字钥匙系统:全方位应急方案设计与实现
  • Nestjs框架: gRPC微服务通信及安全实践全解析
  • 朴朴超市小程序分析
  • 济南物流公司网站建设金华建设工程网站
  • visual basic 从入门到精通 IT9网络学院VB编程系列培训教程
  • 厦门汽车充电站建设报备网站免费ppt模板下载中国风
  • 操作系统期中考试
  • 陕西建设集团韩城公司网站怎样创建基本的网站
  • 每日两题day33
  • 【解决】Failed to remove partition 1 from system: 设备或资源忙
  • Android通过SQL查询trace分析进程启动线程总数量
  • 超轻量级 AI 网安工具
  • 【C++】封装红黑树实现map和set容器(详解)
  • sscanf解析
  • 中专生实习找什么工作?
  • 车辆车身颜色特征识别
  • 【JUnit实战3_28】第十七章:用 JUnit 5 实测 SpringBoot 项目