利用Git开发时对开发者权限控制问题
本文最后更新于 16 天前,其中的信息可能已经有所发展或是发生改变。

一、方案详细描述

架构设计

本方案通过 裸仓库管理员工作目录 和 生产目录 实现代码协作与自动化部署,确保开发与生产环境隔离。目录结构如下:

/mnt/odoo/odoo17/custom/addons/
├── aams.git            # 裸仓库(开发者推送目标,存储所有分支)
├── aams_worktree       # 管理员工作目录(用于合并分支)
└── aams                # 生产目录(实际运行代码,由钩子自动同步)
目录用途
aams.git中央仓库,开发者推送/拉取分支,仅管理员可以操作main分支
aams_worktree管理员本地工作区,用于合并分支、解决冲突
aams生产环境代码,用钩子自动从aams.git同步,禁止直接修改

角色权限:

角色权限
开发者1. 推送/拉取个人分支
2. 禁止操作main分支
管理员1. 合并分支到main
2. 推送main分支触发同步钩子
3. 管理钩子脚本等

开发管理流程

  1. 开发者推送分支:将代码推送到裸仓库的个人分支(如dev_myname)。
  2. 管理员合并分支:在工作目录中将 dev_myname 合并到 main
  3. 触发同步:推送 main 分支到裸仓库,触发钩子自动同步到生产目录并重启服务。

二、配置与使用指南

1. 开发者配置与操作

环境准备

  • 克隆仓库
#bash
git clone user@server:/mnt/odoo/odoo17/custom/addons/aams.git 
cd aams

开发者管理

  • 创建个人分支,开发者统一将自己的分支命名为dev_{名字缩写}
#bash
git checkout -b dev_yourname
  • 提交代码
git add .
git commit -m "做了什么"
  • 推送到服务器
git push -u origin dev_yourname  #首次推送
git push origin dev_yourname    #后续推送
  • 注意:任何开发者直接对main分支进行操作是被禁止的,因为对于main分支的操作会触发钩子,而钩子文件会自动更新实际使用的Odoo模块。因此只有Odoo服务器管理员可以对服务器仓库的main分支进行操作。下面对管理员的配置和操作做详细说明。

2. 管理员的配置与操作

环境准备

  • 克隆仓库到工作目录(在服务器操作,以odoo用户登录),这一步只做一次,后续开发者不要再操作这一步。
git clone /mnt/odoo/odoo17/custom/addons/aams.git /mnt/odoo/odoo17/custom/addons/aams_worktree
cd /mnt/odoo/odoo17/custom/addons/aams_worktree
  • 拉取所有分支
git fetch --all
git branch -r | grep -v '\->' | while read remote; do 
  git branch --track "${remote#origin/}" "$remote"
done

合并与部署流程

  • 合并分支到main
git checkout main
git merge origin/dev_yourname --no-ff -m "Merge dev_yourname: 新功能"
  • 解决冲突(如果有)
  • 推送到main分支并触发钩子文件
git push origin main  # 推送 main 分支,触发钩子同步到生产目录

3. 钩子配置与验证

钩子脚本内容

  • pre-receive(权限控制)
#!/bin/sh
while read oldrev newrev refname; do
  branch=$(git rev-parse --symbolic --abbrev-ref "$refname")
  user=$(whoami)
  if [ "$branch" = "main" ] && [ "$user" != "odoo" ]; then
    echo "错误:仅 odoo 用户可操作 main 分支"
    exit 1
  fi
done
  • post-receive(同步与重启)
#!/bin/sh
while read oldrev newrev refname; do
  branch=$(git rev-parse --symbolic --abbrev-ref "$refname")
  if [ "$branch" = "main" ]; then
    git --work-tree=/mnt/odoo/odoo17/custom/addons/aams checkout -f main
    sudo systemctl restart odoo17
    echo "$(date) - 已同步 main 分支并重启服务" >> /var/log/odoo_deploy.log
  fi
done
  • 权限设置
sudo chown -R odoo:odoo /mnt/odoo/odoo17/custom/addons/aams.git
sudo chmod +x /mnt/odoo/odoo17/custom/addons/aams.git/hooks/*

三、常见问题和维护

钩子未触发同步

  • 检查点
# 确认钩子权限和内容
ls -l /mnt/odoo/odoo17/custom/addons/aams.git/hooks/post-receive
cat /mnt/odoo/odoo17/custom/addons/aams.git/hooks/post-receive

# 查看日志
tail -f /var/log/odoo_deploy.log

开发者无法推送

  • 检查点
# 验证用户权限
ls -ld /mnt/odoo/odoo17/custom/addons/aams.git

# 检查网络和 SSH 配置
ssh odoo@your-server git -T

紧急回滚

# 回退到指定提交
git checkout main
git reset --hard COMMIT_ID
git push -f origin main

四、注意事项

  • 生产目录隔离:禁止直接修改/mnt/odoo/odoo17/custom/addons/aams 中的文件。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇