fix(config): 调整配置加载优先级与项目配置覆盖

- 全局配置优先加载,项目级配置进行增量覆盖
- 环境变量保持最高优先级
- 移除项目根目录 config.yaml 与 configs/config.yaml 探测
- 根命令允许接收任意参数
This commit is contained in:
unclesam committed 2026-08-17 21:46:02 +08:00
1 parent 4515e28efc
commit 0b4d02d232
2 files changed
+18 -16

No files matched your search

+17 -16
View File
@@ -31,34 +31,35 @@ func getConfigPath() (string, error) {
return filepath.Join(dir, "config.yaml"), nil return filepath.Join(dir, "config.yaml"), nil
} }
// LoadConfig 读取全局配置(优先使用环境变量,其次读取 yaml 文件) // LoadConfig 智能读取配置:
// 1. 先读取用户全局配置 ~/.git-air/config.yaml (保证 APIKey 等全局生效)
// 2. 若当前项目存在 .git-air.yaml 或 git-air.yaml,则进行项目级增量覆盖
// 3. 环境变量最高优先级覆盖
func LoadConfig() (*AppConfig, error) { func LoadConfig() (*AppConfig, error) {
cfg := &AppConfig{ cfg := &AppConfig{
Provider: "gemini", Provider: "gemini",
Model: "gemini-3.7-flash", Model: "gemini-3.7-flash",
} }
// 1. 优先探测当前项目根目录下的配置文件 // 1. 首先加载全局配置 ~/.git-air/config.yaml
localCandidates := []string{"config.yaml", ".git-air.yaml", ".git-air.yml", "configs/config.yaml"} configPath, err := getConfigPath()
loaded := false if err == nil {
if data, err := os.ReadFile(configPath); err == nil && len(data) > 0 {
for _, name := range localCandidates {
if data, err := os.ReadFile(name); err == nil && len(data) > 0 {
if err := yaml.Unmarshal(data, cfg); err != nil { if err := yaml.Unmarshal(data, cfg); err != nil {
return nil, fmt.Errorf("解析配置文件失败: %w", err) // 全局配置错误可输出警告或直接返回错误
return nil, fmt.Errorf("解析全局配置文件 [%s] 失败: %w", configPath, err)
} }
loaded = true
break
} }
} }
// 2. 如果项目根目录下没有,则回退读取用户全局配置 ~/.git-air/config.yaml // 2. 检查当前项目是否有专属于 git-air 的配置文件 (.git-air.yaml / git-air.yaml) 进行增量覆盖
if !loaded { localCandidates := []string{".git-air.yaml", ".git-air.yml", "git-air.yaml"}
configPath, err := getConfigPath() for _, name := range localCandidates {
if err == nil { if data, err := os.ReadFile(name); err == nil && len(data) > 0 {
if data, err := os.ReadFile(configPath); err == nil { if err := yaml.Unmarshal(data, cfg); err != nil {
_ = yaml.Unmarshal(data, cfg) return nil, fmt.Errorf("解析项目配置文件 [%s] 失败: %w", name, err)
} }
break
} }
} }
+1
View File
@@ -16,6 +16,7 @@ var rootCmd = &cobra.Command{
Short: "git-air: 极轻量、极速的 Git 原生 AI 代码评审工具", Short: "git-air: 极轻量、极速的 Git 原生 AI 代码评审工具",
Long: `git-air 是一个纯 Go 编写的 Git AI 评审利器。 Long: `git-air 是一个纯 Go 编写的 Git AI 评审利器。
支持一键评审暂存区、指定 Commit、分支差异或单文件,无缝兼容 Gemini、DeepSeek、Ollama 和 OpenAI。`, 支持一键评审暂存区、指定 Commit、分支差异或单文件,无缝兼容 Gemini、DeepSeek、Ollama 和 OpenAI。`,
Args: cobra.ArbitraryArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
ctx := cmd.Context() ctx := cmd.Context()