Goose迁移文件必须按分支管理,因其不感知Git分支,仅读取当前目录migrations/内容;切换分支时若迁移文件未纳入版本控制或命名冲突,将导致文件缺失、状态错乱或执行失败。

多分支并行开发时,数据库迁移脚本必须和代码分支严格对齐,否则git checkout feature/login后执行goose up可能报错“找不到 migration 002_add_users_table.sql”——这不是 Goose 问题,而是迁移文件没随分支一起检出。
Goose 迁移文件为什么必须按分支管理
Goose 本身不感知 Git 分支,它只读取当前工作目录下的 migrations/ 文件夹。当你切换分支时,如果迁移文件没被纳入版本控制或命名/顺序不一致,Goose 就会丢失上下文。
- 迁移文件名含时间戳(如
202405121030_add_index_to_orders.sql),但不同分支可能生成相同时间戳 → 冲突或覆盖 -
develop分支有 5 个迁移,feature/reporting只有前 3 个 →goose status显示 pending,但实际是文件缺失 - PostgreSQL 的
goose_db_version表记录的是全局已应用的 migration ID,跨分支直接goose up会跳过本应执行的变更
迁移文件命名与提交策略
迁移文件不是“写完就 commit”,它必须绑定到对应功能的代码变更里,且命名要体现分支上下文。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
- 用分支名前缀:例如
feature-auth_202607011422_create_sessions_table.sql,避免纯时间戳冲突 - 每个迁移文件只做一件事,且必须包含
-- +goose Up和-- +goose Down块,否则goose down失效 - 提交时,迁移文件和对应模型/DAO 修改必须在同一个 commit,禁止“先提代码、后补 migration”
- 禁止在
main或release/*分支上新增迁移 —— 所有结构变更必须从feature/*出发,经develop合并后才可进入发布线
feature 分支里怎么安全执行 goose up
在 feature/login 中运行 goose up 前,你得确认三件事:本地数据库干净、迁移文件完整、目标环境匹配。
- 用
goose -dir migrations -dialect postgres status查当前状态,确保 pending 列显示的是本分支该执行的迁移 - 不要依赖
goose up自动找最新 —— 显式指定版本:goose -dir migrations -dialect postgres up 202607011422 - 本地开发库建议用 Docker 每次重置:
docker rm -f goose-dev-db && docker run -d --name goose-dev-db -p 5432:5432 -e POSTGRES_PASSWORD=pass postgres:15 - CI 流水线中,禁止在
develop合并 PR 时自动执行goose up—— 改为验证goose validate是否通过,把执行权留给发布阶段
release 分支合并时如何同步数据库变更
release/v2.3.0 分支切出后,数据库结构必须冻结。此时迁移文件不能再增删,只能验证一致性。
- 合并前,在
release/v2.3.0上运行goose -dir migrations -dialect postgres status,比对develop的输出是否完全一致 - 若发现某迁移在
develop已应用、但在release分支缺失文件 → 立即中止合并,回溯该 feature 的 PR 是否漏提交 migration - 打 tag 前,用
goose -dir migrations -dialect postgres up在 staging 环境执行一次全量迁移,并截图保存goose status输出作为发布凭证 - 禁止在
release分支上goose down—— 它只用于开发调试,生产环境没有回退 DDL 的需求
最常被忽略的一点:Goose 的 migrations/ 目录不是“配置”,它是代码的一部分;分支切换时它必须像 src/ 一样被 Git 精确跟踪。任何绕过 Git 直接拷贝、生成或忽略迁移文件的操作,都会在下一次 git checkout 后暴露问题。

















