{"version":3,"sources":["../../src/config.ts","../../src/multiRepoMerge.ts","../../src/index.ts"],"names":["ConfigManager","path","os","fs","content","error","repo","existingIndex","r","name","history","MultiRepoMerge","config","repoDir","git","simpleGit","remoteUrlString","remoteUrl","errorMessage","gitError","sourceRepo","sourceBranch","targetRepo","targetBranch","sourceConfig","targetConfig","sourceGit","targetGit","normalizedSourceBranch","checkoutError","pullError","sourceRemoteName","sourceUrl","targetBranches","normalizedTargetBranch","targetBranchExists","branch","strategy","options","remoteBranches","diff","mergeResult","status","e","remoteName","branchName","normalizedBranchName","possibleRefs","branchList","parts","ref","fuzzyMatch","GitMergeTools","workingDir","source","target"],"mappings":"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","file":"index.cjs","sourcesContent":["import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\n\r\nexport interface RepoConfig {\r\n  name: string;\r\n  url: string;\r\n  type: 'gitee' | 'gitea';\r\n  token?: string;\r\n  username?: string;\r\n  password?: string;\r\n}\r\n\r\nexport interface RemoteMergeHistory {\r\n  sourceRepo: string;\r\n  sourceBranch: string;\r\n  targetRepo: string;\r\n  targetBranch: string;\r\n  options: {\r\n    showDiff?: boolean;\r\n    conflictStrategy?: 'ours' | 'theirs';\r\n    push?: boolean;\r\n  };\r\n  timestamp: number;\r\n}\r\n\r\nexport class ConfigManager {\r\n  private configPath: string;\r\n  private config: { repos: RepoConfig[]; remoteMergeHistory?: RemoteMergeHistory };\r\n\r\n  constructor() {\r\n    this.configPath = path.join(os.homedir(), '.supos-git-config.json');\r\n    this.config = this.loadConfig();\r\n  }\r\n\r\n  private loadConfig(): { repos: RepoConfig[]; remoteMergeHistory?: RemoteMergeHistory } {\r\n    try {\r\n      if (fs.existsSync(this.configPath)) {\r\n        const content = fs.readFileSync(this.configPath, 'utf-8');\r\n        return JSON.parse(content);\r\n      }\r\n    } catch (error) {\r\n      console.error('加载配置文件失败:', error);\r\n    }\r\n    return { repos: [] };\r\n  }\r\n\r\n  private saveConfig(): void {\r\n    try {\r\n      fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\r\n    } catch (error: any) {\r\n      throw new Error(`保存配置文件失败: ${error.message}`);\r\n    }\r\n  }\r\n\r\n  addRepo(repo: RepoConfig): void {\r\n    const existingIndex = this.config.repos.findIndex((r) => r.name === repo.name);\r\n    if (existingIndex >= 0) {\r\n      this.config.repos[existingIndex] = repo;\r\n    } else {\r\n      this.config.repos.push(repo);\r\n    }\r\n    this.saveConfig();\r\n  }\r\n\r\n  getRepo(name: string): RepoConfig | undefined {\r\n    return this.config.repos.find((repo) => repo.name === name);\r\n  }\r\n\r\n  removeRepo(name: string): void {\r\n    this.config.repos = this.config.repos.filter((repo) => repo.name !== name);\r\n    this.saveConfig();\r\n  }\r\n\r\n  listRepos(): RepoConfig[] {\r\n    return this.config.repos;\r\n  }\r\n\r\n  /**\r\n   * 保存远程合并历史记录\r\n   * @param history 远程合并历史记录\r\n   */\r\n  saveRemoteMergeHistory(history: RemoteMergeHistory): void {\r\n    this.config.remoteMergeHistory = history;\r\n    this.saveConfig();\r\n  }\r\n\r\n  /**\r\n   * 获取远程合并历史记录\r\n   * @returns 远程合并历史记录，如果不存在则返回undefined\r\n   */\r\n  getRemoteMergeHistory(): RemoteMergeHistory | undefined {\r\n    return this.config.remoteMergeHistory;\r\n  }\r\n}\r\n","import simpleGit, { SimpleGit } from 'simple-git';\r\nimport path from 'node:path';\r\nimport fs from 'node:fs';\r\nimport os from 'node:os';\r\nimport { ConfigManager, RepoConfig } from './config';\r\n\r\nexport class MultiRepoMerge {\r\n  private configManager: ConfigManager;\r\n  private tempDir: string;\r\n\r\n  constructor() {\r\n    this.configManager = new ConfigManager();\r\n    this.tempDir = path.join(os.tmpdir(), 'supos-git-merge');\r\n    if (!fs.existsSync(this.tempDir)) {\r\n      fs.mkdirSync(this.tempDir, { recursive: true });\r\n    }\r\n  }\r\n\r\n  async initRepo(config: RepoConfig): Promise<SimpleGit> {\r\n    const repoDir = path.join(this.tempDir, config.name);\r\n    if (!fs.existsSync(repoDir)) {\r\n      fs.mkdirSync(repoDir, { recursive: true });\r\n    }\r\n\r\n    const git = simpleGit(repoDir);\r\n\r\n    // 添加进度监听器\r\n    // git.outputHandler((_, stdout, stderr) => {\r\n    //   stdout.pipe(process.stdout);\r\n    //   stderr.pipe(process.stderr);\r\n    // });\r\n\r\n    try {\r\n      // 初始化Git仓库（如果不存在）\r\n      if (!fs.existsSync(path.join(repoDir, '.git'))) {\r\n        await git.init();\r\n      }\r\n\r\n      // 配置认证信息\r\n      let remoteUrlString = config.url;\r\n      try {\r\n        const remoteUrl = new URL(config.url);\r\n        // 移除现有的认证信息（如果有）\r\n        remoteUrl.username = '';\r\n        remoteUrl.password = '';\r\n\r\n        // 重新构建URL，将认证信息放在正确的位置\r\n        if (config.token) {\r\n          remoteUrlString = remoteUrl\r\n            .toString()\r\n            .replace(/^(https?:\\/\\/)(.+)$/, `$1${encodeURIComponent(config.token)}@$2`);\r\n        } else if (config.username && config.password) {\r\n          remoteUrlString = remoteUrl\r\n            .toString()\r\n            .replace(\r\n              /^(https?:\\/\\/)(.+)$/,\r\n              `$1${encodeURIComponent(config.username)}:${encodeURIComponent(config.password)}@$2`\r\n            );\r\n        }\r\n      } catch (error) {\r\n        console.warn(`[${config.name}] URL解析失败，使用原始URL`);\r\n      }\r\n\r\n      // 确保origin远程仓库已配置\r\n      try {\r\n        const currentUrl = await git.remote(['get-url', 'origin']);\r\n        if (currentUrl?.trim() !== remoteUrlString.trim()) {\r\n          await git.remote(['set-url', 'origin', remoteUrlString]);\r\n        }\r\n      } catch {\r\n        await git.remote(['add', 'origin', remoteUrlString]);\r\n      }\r\n\r\n      // 使用更强的fetch参数，确保获取所有远程分支信息\r\n      await git.fetch(['--all', '--prune', '--tags', '--force']);\r\n      return git;\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`[${config.name}] Git操作失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  async mergeCrossBranch(\r\n    sourceRepo: string,\r\n    sourceBranch: string,\r\n    targetRepo: string,\r\n    targetBranch: string\r\n  ): Promise<void> {\r\n    const sourceConfig = this.configManager.getRepo(sourceRepo);\r\n    const targetConfig = this.configManager.getRepo(targetRepo);\r\n\r\n    if (!sourceConfig || !targetConfig) {\r\n      throw new Error('源仓库或目标仓库配置不存在');\r\n    }\r\n\r\n    const sourceGit = await this.initRepo(sourceConfig);\r\n    const targetGit = await this.initRepo(targetConfig);\r\n\r\n    try {\r\n      // 在源仓库中获取最新代码并检查分支是否存在\r\n      await sourceGit.fetch(['--all', '--prune', '--tags', '--force']);\r\n\r\n      // 检查源分支是否存在\r\n      const sourceBranchExists = await this.checkRemoteBranchExists(sourceRepo, sourceBranch, sourceGit);\r\n      if (!sourceBranchExists) {\r\n        throw new Error(`源分支 '${sourceBranch}' 在仓库 '${sourceRepo}' 中不存在`);\r\n      }\r\n\r\n      const normalizedSourceBranch = sourceBranch.replace(/^(origin\\/|remotes\\/origin\\/|source_[^/]+\\/)/, '');\r\n\r\n      // 切换到源分支\r\n      try {\r\n        // 先尝试直接切换到本地分支\r\n        await sourceGit.checkout(normalizedSourceBranch);\r\n      } catch (error) {\r\n        // 如果本地分支不存在，创建并跟踪远程分支\r\n        try {\r\n          await sourceGit.checkout(['-b', normalizedSourceBranch, '--track', `origin/${normalizedSourceBranch}`]);\r\n        } catch (checkoutError) {\r\n          console.error(`[${sourceRepo}] 创建跟踪分支失败:`, checkoutError);\r\n          // 最后尝试直接获取远程分支内容\r\n          await sourceGit.fetch(['origin', normalizedSourceBranch, '--update-head-ok']);\r\n          // 创建本地分支但不设置跟踪\r\n          await sourceGit.checkout(['-b', normalizedSourceBranch]);\r\n        }\r\n      }\r\n\r\n      // 确保分支内容是最新的\r\n      try {\r\n        await sourceGit.pull('origin', normalizedSourceBranch);\r\n      } catch (pullError) {\r\n        console.warn(`[${sourceRepo}] 拉取更新失败，继续使用当前内容:`, pullError);\r\n      }\r\n\r\n      // 在目标仓库中设置源仓库为远程仓库\r\n      const sourceRemoteName = `source_${sourceRepo}`;\r\n      try {\r\n        await targetGit.remote(['remove', sourceRemoteName]);\r\n      } catch (error) {\r\n        // 忽略移除不存在的远程仓库时的错误\r\n      }\r\n      // 使用源仓库的认证信息构建URL\r\n      const sourceUrl = new URL(sourceConfig.url);\r\n      if (sourceConfig.token) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.token);\r\n        sourceUrl.password = '';\r\n      } else if (sourceConfig.username && sourceConfig.password) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.username);\r\n        sourceUrl.password = encodeURIComponent(sourceConfig.password);\r\n      }\r\n\r\n      await targetGit.remote(['add', sourceRemoteName, sourceUrl.toString()]);\r\n      await targetGit.fetch([sourceRemoteName, '--force']);\r\n      // 检查目标分支是否存在\r\n      await targetGit.fetch(['--all', '--prune', '--tags', '--force']);\r\n      const targetBranches = await targetGit.branch(['--all']);\r\n      const normalizedTargetBranch = targetBranch.replace(/^origin\\//, '');\r\n      let targetBranchExists = targetBranches.all.some((branch) => {\r\n        const normalizedBranch = branch\r\n          .trim()\r\n          .replace(/^remotes\\/origin\\//, '')\r\n          .replace(/^origin\\//, '');\r\n        const result = normalizedBranch === normalizedTargetBranch;\r\n        return result;\r\n      });\r\n\r\n      if (!targetBranchExists) {\r\n        // 尝试直接检查远程分支是否存在\r\n        const remoteBranches = await targetGit.listRemote(['--heads']);\r\n        targetBranchExists = remoteBranches.includes(`refs/heads/${normalizedTargetBranch}`);\r\n        if (!targetBranchExists) {\r\n          throw new Error(\r\n            `目标分支 '${targetBranch}' 在仓库 '${targetRepo}' 中不存在\\n可用的远程分支:\\n${targetBranches.all.join('\\n')}`\r\n          );\r\n        }\r\n\r\n        // 如果远程分支存在但本地没有，先创建本地跟踪分支\r\n        await targetGit.fetch(['origin', normalizedTargetBranch]);\r\n      }\r\n\r\n      // 切换到目标分支\r\n      try {\r\n        // 先尝试直接切换到本地分支\r\n        await targetGit.checkout(normalizedTargetBranch);\r\n      } catch (error) {\r\n        // 如果本地分支不存在，创建并跟踪远程分支\r\n        try {\r\n          await targetGit.checkout(['-b', normalizedTargetBranch, '--track', `origin/${normalizedTargetBranch}`]);\r\n        } catch (checkoutError) {\r\n          console.error(`[${targetRepo}] 创建跟踪分支失败:`, checkoutError);\r\n          // 最后尝试直接获取远程分支内容\r\n          await targetGit.fetch(['origin', normalizedTargetBranch, '--update-head-ok']);\r\n          // 创建本地分支但不设置跟踪\r\n          await targetGit.checkout(['-b', normalizedTargetBranch]);\r\n        }\r\n      }\r\n\r\n      // 确保分支内容是最新的\r\n      try {\r\n        await targetGit.pull('origin', normalizedTargetBranch);\r\n      } catch (pullError) {\r\n        console.warn(`[${targetRepo}] 拉取更新失败，继续使用当前内容:`, pullError);\r\n      }\r\n      try {\r\n        // 尝试合并源分支\r\n        await targetGit.merge([`${sourceRemoteName}/${normalizedSourceBranch}`]);\r\n        // 推送合并结果\r\n        await targetGit.push('origin', normalizedTargetBranch);\r\n      } catch (error: any) {\r\n        console.error(`[${targetRepo}] 合并失败:`, error.message);\r\n        throw new Error(`分支合并失败: ${error.message}`);\r\n      }\r\n      // 清理临时远程仓库\r\n      await targetGit.remote(['remove', sourceRemoteName]);\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`跨仓库合并失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  async abortMerge(repo: string): Promise<void> {\r\n    const config = this.configManager.getRepo(repo);\r\n    if (!config) {\r\n      throw new Error('仓库配置不存在');\r\n    }\r\n    const git = await this.initRepo(config);\r\n    try {\r\n      await git.merge(['--abort']);\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`中止合并失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  async resolveConflicts(repo: string, strategy: 'ours' | 'theirs'): Promise<void> {\r\n    const config = this.configManager.getRepo(repo);\r\n    if (!config) {\r\n      throw new Error('仓库配置不存在');\r\n    }\r\n\r\n    const git = await this.initRepo(config);\r\n    try {\r\n      if (strategy === 'ours') {\r\n        await git.checkout(['--ours', '.']);\r\n      } else {\r\n        await git.checkout(['--theirs', '.']);\r\n      }\r\n      await git.add('.');\r\n      console.log(`[${repo}] 冲突已解决`);\r\n    } catch (error: any) {\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`解决冲突失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 合并两个远程分支\r\n   * 相比mergeCrossBranch，此方法更专注于远程分支合并，减少了本地分支操作\r\n   * @param sourceRepo 源仓库名称\r\n   * @param sourceBranch 源分支名称\r\n   * @param targetRepo 目标仓库名称\r\n   * @param targetBranch 目标分支名称\r\n   * @param options 合并选项\r\n   */\r\n  async mergeRemoteBranches(\r\n    sourceRepo: string,\r\n    sourceBranch: string,\r\n    targetRepo: string,\r\n    targetBranch: string,\r\n    options: {\r\n      /** 是否在合并前显示差异 */\r\n      showDiff?: boolean;\r\n      /** 合并冲突时的自动解决策略 */\r\n      conflictStrategy?: 'ours' | 'theirs';\r\n      /** 是否推送合并结果 */\r\n      push?: boolean;\r\n    } = {}\r\n  ): Promise<void> {\r\n    const sourceConfig = this.configManager.getRepo(sourceRepo);\r\n    const targetConfig = this.configManager.getRepo(targetRepo);\r\n\r\n    if (!sourceConfig || !targetConfig) {\r\n      throw new Error('源仓库或目标仓库配置不存在');\r\n    }\r\n\r\n    // 规范化分支名称，移除可能的前缀\r\n    const normalizedSourceBranch = sourceBranch.replace(/^(remotes\\/)?origin\\//, '');\r\n    const normalizedTargetBranch = targetBranch.replace(/^(remotes\\/)?origin\\//, '');\r\n\r\n    const targetGit = await this.initRepo(targetConfig);\r\n    const sourceRemoteName = `source_${sourceRepo}`;\r\n\r\n    try {\r\n      // 1. 在目标仓库中设置源仓库为远程仓库\r\n      try {\r\n        await targetGit.remote(['remove', sourceRemoteName]);\r\n      } catch (error) {\r\n        // 忽略移除不存在的远程仓库时的错误\r\n      }\r\n\r\n      // 使用源仓库的认证信息构建URL\r\n      const sourceUrl = new URL(sourceConfig.url);\r\n      if (sourceConfig.token) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.token);\r\n        sourceUrl.password = '';\r\n      } else if (sourceConfig.username && sourceConfig.password) {\r\n        sourceUrl.username = encodeURIComponent(sourceConfig.username);\r\n        sourceUrl.password = encodeURIComponent(sourceConfig.password);\r\n      }\r\n\r\n      await targetGit.remote(['add', sourceRemoteName, sourceUrl.toString()]);\r\n\r\n      // 2. 获取源仓库和目标仓库的最新代码\r\n      await targetGit.fetch(['--all', '--prune', '--tags']);\r\n      await targetGit.fetch([sourceRemoteName, '--force']);\r\n\r\n      // 3. 验证分支是否存在\r\n      const remoteBranches = await targetGit.listRemote(['--heads']);\r\n\r\n      // 检查源分支是否存在\r\n      const sourceExists =\r\n        (await this.checkRemoteBranchExists(sourceRemoteName, normalizedSourceBranch, targetGit)) ||\r\n        remoteBranches.includes(`refs/heads/${normalizedSourceBranch}`);\r\n      if (!sourceExists) {\r\n        // 尝试直接检查源仓库中的分支\r\n        const sourceGit = await this.initRepo(sourceConfig);\r\n        const sourceBranchExists = await this.checkRemoteBranchExists(sourceRepo, normalizedSourceBranch, sourceGit);\r\n        if (!sourceBranchExists) {\r\n          throw new Error(`源分支 '${sourceBranch}' 在仓库 '${sourceRepo}' 中不存在`);\r\n        }\r\n      }\r\n\r\n      // 检查目标分支是否存在\r\n      const targetExists = remoteBranches.includes(`refs/heads/${normalizedTargetBranch}`);\r\n      if (!targetExists) {\r\n        throw new Error(`目标分支 '${targetBranch}' 在仓库 '${targetRepo}' 中不存在`);\r\n      }\r\n\r\n      // 4. 切换到目标分支\r\n      try {\r\n        await targetGit.checkout(normalizedTargetBranch);\r\n      } catch (error) {\r\n        // 如果本地分支不存在，创建跟踪分支\r\n        await targetGit.checkout(['-b', normalizedTargetBranch, '--track', `origin/${normalizedTargetBranch}`]);\r\n      }\r\n\r\n      // 确保目标分支是最新的\r\n      await targetGit.pull('origin', normalizedTargetBranch);\r\n\r\n      // 5. 显示将要合并的差异（如果需要）\r\n      if (options.showDiff) {\r\n        console.log(`[${targetRepo}] 显示将要合并的差异...`);\r\n        const diff = await targetGit.diff([`HEAD`, `${sourceRemoteName}/${normalizedSourceBranch}`]);\r\n        console.log(diff);\r\n      }\r\n\r\n      // 6. 执行合并\r\n      try {\r\n        const mergeResult = await targetGit.merge([`${sourceRemoteName}/${normalizedSourceBranch}`]);\r\n        // 检查是否已经是最新的（Already up to date）\r\n        const hasRealChanges =\r\n          mergeResult.summary.changes > 0 || mergeResult.summary.insertions > 0 || mergeResult.summary.deletions > 0;\r\n        if (!hasRealChanges) {\r\n          console.log(`[${targetRepo}] 分支已经是最新的，无需合并`);\r\n          // 9. 清理临时远程仓库\r\n          console.log(`[${targetRepo}] 清理临时远程仓库...`);\r\n          await targetGit.remote(['remove', sourceRemoteName]);\r\n          return;\r\n        }\r\n        // 7. 如果有冲突且指定了冲突解决策略，自动解决冲突\r\n        if (options.conflictStrategy) {\r\n          const status = await targetGit.status();\r\n          if (status.conflicted.length > 0) {\r\n            console.log(\r\n              `[${targetRepo}] 检测到${status.conflicted.length}个冲突文件，使用${options.conflictStrategy === 'ours' ? '我们的' : '他们的'}策略解决...`\r\n            );\r\n            await this.resolveConflicts(targetRepo, options.conflictStrategy);\r\n            await targetGit.commit(\r\n              `自动合并 ${sourceRepo}/${normalizedSourceBranch} 到 ${targetRepo}/${normalizedTargetBranch}`\r\n            );\r\n          }\r\n        }\r\n\r\n        // 8. 推送合并结果（如果需要）\r\n        if (options.push !== false) {\r\n          // 默认推送\r\n          console.log(`[${targetRepo}] 推送合并结果...`);\r\n          await targetGit.push('origin', normalizedTargetBranch);\r\n          console.log(`[${targetRepo}] 推送完成`);\r\n        }\r\n      } catch (error: any) {\r\n        console.error(`[${targetRepo}] 合并失败:`, error.message);\r\n        throw new Error(`分支合并失败: ${error.message}`);\r\n      }\r\n\r\n      // 9. 清理临时远程仓库\r\n      console.log(`[${targetRepo}] 清理临时远程仓库...`);\r\n      await targetGit.remote(['remove', sourceRemoteName]);\r\n\r\n      console.log('远程分支合并完成');\r\n    } catch (error: any) {\r\n      // 清理临时远程仓库\r\n      try {\r\n        await targetGit.remote(['remove', sourceRemoteName]);\r\n      } catch (e) {\r\n        console.log(e);\r\n      }\r\n\r\n      const errorMessage = error.message || '未知错误';\r\n      const gitError = error.git ? `\\nGit错误: ${JSON.stringify(error.git, null, 2)}` : '';\r\n      throw new Error(`远程分支合并失败: ${errorMessage}${gitError}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 检查远程仓库中是否存在指定分支\r\n   * @param remoteName 远程仓库名称\r\n   * @param branchName 分支名称\r\n   * @param git Git实例\r\n   */\r\n  private async checkRemoteBranchExists(remoteName: string, branchName: string, git: SimpleGit): Promise<boolean> {\r\n    const remoteBranches = await git.listRemote(['--heads']);\r\n\r\n    // 规范化分支名称\r\n    const normalizedBranchName = branchName.replace(\r\n      /^(origin\\/|remotes\\/origin\\/|source_[^/]+\\/|refs\\/heads\\/|refs\\/remotes\\/[^/]+\\/)/,\r\n      ''\r\n    );\r\n\r\n    // 检查可能的分支引用格式\r\n    const possibleRefs = [\r\n      `refs/heads/${normalizedBranchName}`,\r\n      `refs/remotes/source_${remoteName}/${normalizedBranchName}`,\r\n      `refs/remotes/origin/${normalizedBranchName}`,\r\n      `HEAD:refs/heads/${normalizedBranchName}`,\r\n      normalizedBranchName,\r\n      `source_${remoteName}/${normalizedBranchName}`,\r\n      `origin/${normalizedBranchName}`,\r\n      `refs/remotes/${remoteName}/${normalizedBranchName}`,\r\n    ];\r\n\r\n    // 将远程分支列表拆分为数组并规范化\r\n    const branchList = remoteBranches\r\n      .split('\\n')\r\n      .map((branch) => {\r\n        const parts = branch.trim().split(/\\s+/);\r\n        return parts.length > 1 ? parts[1] : '';\r\n      })\r\n      .filter(Boolean);\r\n\r\n    // 检查所有可能的引用格式\r\n    for (const ref of possibleRefs) {\r\n      if (branchList.includes(ref)) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    // 如果精确匹配失败，尝试模糊匹配\r\n    const fuzzyMatch = branchList.some((branch) => {\r\n      const normalizedRemoteBranch = branch\r\n        .replace(/^refs\\/heads\\//, '')\r\n        .replace(/^refs\\/remotes\\/[^/]+\\//, '')\r\n        .replace(/^(origin\\/|source_[^/]+\\/)/, '');\r\n      const result = normalizedRemoteBranch === normalizedBranchName;\r\n      return result;\r\n    });\r\n\r\n    // 如果模糊匹配也失败，尝试直接检查远程仓库中的分支\r\n    if (!fuzzyMatch) {\r\n      try {\r\n        // 尝试直接从指定的远程仓库获取分支信息\r\n        const specificRemoteBranches = await git.listRemote([remoteName, '--heads']);\r\n\r\n        // 解析分支列表\r\n        const specificBranchList = specificRemoteBranches\r\n          .split('\\n')\r\n          .map((branch) => {\r\n            const parts = branch.trim().split(/\\s+/);\r\n            return parts.length > 1 ? parts[1] : '';\r\n          })\r\n          .filter(Boolean);\r\n\r\n        // 检查分支是否存在\r\n        const directMatch = specificBranchList.some((branch) => {\r\n          const remoteBranchName = branch.replace(/^refs\\/heads\\//, '');\r\n          const result = remoteBranchName === normalizedBranchName;\r\n          return result;\r\n        });\r\n\r\n        if (directMatch) {\r\n          return true;\r\n        }\r\n      } catch (error) {\r\n        console.warn(`从远程仓库 ${remoteName} 获取分支信息失败:`, error);\r\n        // 错误不影响整体流程，继续后续检查\r\n      }\r\n    }\r\n    return fuzzyMatch;\r\n  }\r\n}\r\n","import simpleGit, { SimpleGit } from 'simple-git';\r\n\r\nexport { ConfigManager } from './config';\r\nexport type { RepoConfig } from './config';\r\nexport { MultiRepoMerge } from './multiRepoMerge';\r\n\r\nexport class GitMergeTools {\r\n  private git: SimpleGit;\r\n\r\n  constructor(workingDir: string) {\r\n    this.git = simpleGit(workingDir);\r\n  }\r\n\r\n  /**\r\n   * 合并源分支到目标分支\r\n   * @param source 源分支名\r\n   * @param target 目标分支名\r\n   */\r\n  async mergeBranch(source: string, target: string): Promise<void> {\r\n    try {\r\n      await this.git.checkout(target);\r\n      await this.git.merge([source]);\r\n    } catch (error: any) {\r\n      throw new Error(`合并分支失败: ${error.message}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 中止当前的合并操作\r\n   */\r\n  async abortMerge(): Promise<void> {\r\n    try {\r\n      await this.git.merge(['--abort']);\r\n    } catch (error: any) {\r\n      throw new Error(`中止合并失败: ${error.message}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 使用指定策略解决冲突\r\n   * @param strategy 解决策略：'ours' 使用我们的更改，'theirs' 使用他们的更改\r\n   */\r\n  async resolveConflicts(strategy: 'ours' | 'theirs'): Promise<void> {\r\n    try {\r\n      if (strategy === 'ours') {\r\n        await this.git.checkout(['--ours', '.']);\r\n      } else {\r\n        await this.git.checkout(['--theirs', '.']);\r\n      }\r\n      await this.git.add('.');\r\n    } catch (error: any) {\r\n      throw new Error(`解决冲突失败: ${error.message}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 获取合并状态\r\n   * @returns 是否处于合并状态\r\n   */\r\n  async isMerging(): Promise<boolean> {\r\n    try {\r\n      const status = await this.git.status();\r\n      return status.conflicted.length > 0;\r\n    } catch (error: any) {\r\n      throw new Error(`获取合并状态失败: ${error.message}`);\r\n    }\r\n  }\r\n}\r\n"]}