thinkphp团队协作核心是规范流程而非工具使用:禁用git pull部署,须用ci/cd执行composer install、缓存清理及权限设置;分支名需含需求id与模块前缀;.env与runtime必须.gitignore但配.example和预建目录;提交信息强制conventional commits并注明db变更。

ThinkPHP 项目用 Git 做团队协作,核心不是“怎么装 Git”,而是“怎么让多人改代码不打架、不丢功能、不炸线上”。靠工具自动同步解决不了问题,靠人守规矩才能落地。
ThinkPHP 团队必须禁用 git pull 直接更新生产环境
很多人在服务器上执行 git pull origin main 部署 ThinkPHP,结果 runtime 目录权限错乱、vendor 未安装、.env 被覆盖、缓存没清——这不是 Git 的锅,是把版本控制当部署工具用了。
- ThinkPHP 的
runtime/目录必须可写,但 Git 不跟踪它;git pull会跳过该目录,导致旧缓存残留或目录结构损坏 -
composer install必须显式执行,否则 vendor 缺失,直接报 Class not found -
.env文件通常被.gitignore排除,git pull后它不会还原,导致数据库连接失败 - 生产环境 PHP 配置(如禁用
putenv)可能让 Composer 或 ThinkPHP 初始化失败,错误静默无提示
正确做法:用 CI/CD 流水线(如 Gitee/GitLab CI)或部署脚本封装完整流程:git fetch → checkout → composer install --no-dev → php think clear → chown www:www runtime/。
分支命名必须带业务标识,别用 feature/login 这种模糊名
ThinkPHP 功能常跨控制器、模型、验证器、路由多个文件,分支名不含上下文,Code Review 和合并时根本看不出影响范围。
- 推荐格式:
feature/REQ-123-user-login-with-sms(关联需求系统 ID + 小写连字符描述) - 禁止:
fix_bug、new_function、update_2024—— 这些名在git log里毫无检索价值 - ThinkPHP 的模块化结构(app/
/)建议分支名体现模块前缀,如 feature/USR-456-user-center-refactor - 发布分支统一用
release/v3.2.0,避免test、pre、beta等非标命名,CI 脚本才好自动识别打 tag
ThinkPHP 的 runtime/ 和 .env 必须进 .gitignore,但得留钩子
这两个目录/文件不进 Git 是铁律,但团队新人常因本地没生成 runtime 报错,或误提交 .env 泄露数据库密码。
-
.gitignore中明确写两行:/runtime/和.env,别用runtime/*—— 否则runtime/.gitkeep也被忽略,导致空目录无法提交 - 在项目根目录放
.env.example,含占位配置(DB_HOST=xxx),新人cp .env.example .env后再改 - ThinkPHP 启动时若检测不到
runtime/,会尝试创建;但宝塔或 Docker 环境下常因用户权限失败 —— 需在部署脚本中预建并赋权:mkdir -p runtime/{cache,log,session,view} - CI 流水线中加检查:
git status --porcelain | grep '\.env',有输出就 fail,防误提交
提交信息必须用 Conventional Commits,否则 php think migrate 难回溯
ThinkPHP 的数据库迁移(php think migrate:run)依赖 commit 时间顺序,如果提交像 “update file” 或 “fix bug”,谁也猜不出哪个 commit 引入了新字段或删了索引。
- 强制格式:
feat(auth): add phone verification in login flow、fix(user): prevent empty nickname in profile update - 涉及数据库变更的提交,正文第一行必须写
DB: alter table user add column phone_verified tinyint default 0—— 方便 DBA 审核 - ThinkPHP 的
route:list或model:build类命令生成的文件,提交时要附带说明生成依据(如 “generated from User model after adding avatar_url field”) - 禁用
git commit -m "xxx"单行提交,用git commit唤起编辑器,确保正文有上下文
最易被忽略的是:ThinkPHP 的中间件、事件监听器、命令行指令这些“隐性入口”,它们的注册逻辑散落在 config/ 或 app/ 下,却不在控制器里——分支合并时极易遗漏,必须靠清晰的提交信息和 Code Review 卡点。**没人会为一行 Event::listen('UserLoginSuccess', ...) 写测试,但有人会为 feat(event): trigger login success event for analytics 多看一眼。**
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











