UNPKG

@supos-ce-platform/git-tools

Version:

Supos ce platform Git tools, supos, ce, platform, git tools

1 lines 41.8 kB
{"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"]}