git 不支持按分支自动切换环境变量,因其配置系统是静态的,git config --local core.env 对整个仓库生效且不随分支变化;可行方案是用 pre-checkout 钩子或 direnv 加载分支对应 .env 文件,或在 ci/cd 中通过分支规则注入变量。

Git 本身不支持“根据分支名自动切换环境变量”,它没有内置的分支级环境变量加载机制。所有通过 git config --local 或 .gitconfig 的 [core] env 设置,都是全局生效(对当前仓库所有分支都起作用),不会随 git checkout 自动变更。
为什么 git config core.env 不按分支生效
Git 的配置系统是静态的:一旦写入 .git/config 或通过 git config --local 设置,该配置就绑定到整个仓库,和当前检出的分支无关。即使你用脚本在切换分支时手动改写 [core] env,Git 也不会自动 reload,且容易被后续操作覆盖或引发竞态。
-
git config --local core.env=KEY=value只写一次,不会监听分支变化 - 修改
.git/config后需显式执行git config --reload,但该命令不触发钩子,也不被 Git 内部调用 - 多人协作时,这类手动修改极易被
git reset、git clone或 IDE 自动同步覆盖
真正可行的替代方案:pre-checkout 钩子 + .env 文件
靠 Git 自身做不到分支感知,但可以用 pre-checkout 钩子在切换前读取当前分支名,再加载对应 .env 文件(如 .env.main、.env.dev),注入到 shell 环境中。这需要配合外部工具(如 direnv 或自定义脚本)实现。
- 在
.git/hooks/pre-checkout中写 shell 脚本,用git symbolic-ref --short HEAD获取目标分支名 - 根据分支名匹配预设的
.env.*文件(例如dev→.env.dev),用set -a; source .env.dev; set +a加载 - 注意:钩子只影响当前 shell 会话,不跨终端;若用 VS Code 或 IDE 启动终端,需确保其继承钩子设置的变量
- 推荐用
direnv allow+.envrc替代手写钩子,更可靠:use git_branch可触发分支感知逻辑
CI/CD 场景下更稳妥的做法:GitLab CI 的 variables + rules
如果你的目标是“不同分支走不同环境配置”,别在本地 Git 层面折腾,直接交给 CI 工具。GitLab CI 支持基于分支名的变量注入和条件加载:
- 在
.gitlab-ci.yml中用variables:定义通用变量,再用rules:按$CI_COMMIT_BRANCH覆盖特定值 - 避免把敏感变量硬编码进
.gitlab-ci.yml,改用 CI/CD Settings 里的 protected variables,并勾选 “Protected” 限定仅对受保护分支生效 - 配合
.env文件 +dotenv工具(如 GoDotEnv、Python-dotenv)在 job 内部加载,确保本地开发与 CI 行为一致
分支级环境变量本质是“运行时上下文”的问题,不是 Git 配置问题。强行塞进 Git 配置只会增加维护成本和不可预测性;把分支逻辑交给 shell 钩子或 CI 规则,才是稳定、可审计、可协作的路径。











