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 失敗就換下一個策略。