From c63b1a6da2edc6326e766bd9f984d21b3cdd17b6 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 20 Jul 2026 17:40:50 +0800 Subject: [PATCH] =?UTF-8?q?perf(resolveMergeBase):=20=E5=85=88=20deepen=20?= =?UTF-8?q?base/HEAD=EF=BC=8C--unshallow=20=E9=99=8D=E7=82=BA=E6=9C=80?= =?UTF-8?q?=E5=BE=8C=E6=89=8B=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- src/lib/gitrepo.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/lib/gitrepo.js b/src/lib/gitrepo.js index b839345..499dec9 100644 --- a/src/lib/gitrepo.js +++ b/src/lib/gitrepo.js @@ -130,17 +130,16 @@ function resolveMergeBase(cwd, baseRef) { diagnostics.push('merge-base(首次):失敗'); } - // 資料驅動的補抓策略:淺層才 unshallow;其後依序 deepen base 與 HEAD。 - // 每個策略成功後立即重試 merge-base,成功即回傳,避免多餘往返。 - const strategies = []; + // 資料驅動的補抓策略:先以固定深度分批加深 base 與 HEAD(每步後重試 merge-base,成功即回傳); + // 只有仍失敗且為淺層 repo 時,才把成本最高的 --unshallow(下載完整歷史)當最後手段, + // 避免大型/長壽 repo 只為找共同祖先就無謂拉全史。 + const strategies = [ + ['deepen base', 'fetch', '--no-tags', '--deepen=1000', 'origin', `+refs/heads/${baseRef}:refs/remotes/${remoteBase}`], + ['deepen HEAD', 'fetch', '--no-tags', '--deepen=1000', 'origin', 'HEAD'], + ]; if (gitTrim(cwd, 'rev-parse', '--is-shallow-repository') === 'true') { strategies.push(['unshallow', 'fetch', '--no-tags', '--unshallow', 'origin']); } - strategies.push([ - 'deepen base', - 'fetch', '--no-tags', '--deepen=1000', 'origin', `+refs/heads/${baseRef}:refs/remotes/${remoteBase}`, - ]); - strategies.push(['deepen HEAD', 'fetch', '--no-tags', '--deepen=1000', 'origin', 'HEAD']); for (const [label, ...args] of strategies) { if (!runFetch(label, ...args)) continue; // fetch 失敗就換下一個策略。