From 83dd56f37f27e254d5c4176ecab397d87f4c5c5b Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 20 Jul 2026 18:04:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(resolveMergeBase):=20deepen=20HEAD=20?= =?UTF-8?q?=E6=94=B9=E4=BB=A5=E7=9B=AE=E5=89=8D=20HEAD=20=E7=9A=84=20SHA?= =?UTF-8?q?=20=E8=A3=9C=E6=8A=93=20PR=20head=20=E6=AD=B7=E5=8F=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原策略 fetch 遠端符號 HEAD,會被伺服器解析為遠端預設分支, 只加深預設分支歷史、補不到目前 checkout 的 PR head,淺層時仍可能算不出 merge-base。 改先 rev-parse 取得 HEAD 的 commit SHA,以該 SHA 加深 PR head 側歷史。 Co-Authored-By: Claude Opus 4.8 (1M context) --- src/lib/gitrepo.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/gitrepo.js b/src/lib/gitrepo.js index 2e3e6f9..7eda1e1 100644 --- a/src/lib/gitrepo.js +++ b/src/lib/gitrepo.js @@ -133,9 +133,12 @@ function resolveMergeBase(cwd, baseRef) { // 資料驅動的補抓策略:先以固定深度分批加深 base 與 HEAD(每步後重試 merge-base,成功即回傳); // 只有仍失敗且為淺層 repo 時,才把成本最高的 --unshallow(下載完整歷史)當最後手段, // 避免大型/長壽 repo 只為找共同祖先就無謂拉全史。 + // 加深 HEAD 側須以「目前 HEAD 的 commit SHA」補抓——遠端符號 `HEAD` 由伺服器解析為 + // 遠端預設分支(非目前 checkout 的 PR head),只加深它並不會補到 PR head 的歷史。 + const headSha = gitTrim(cwd, 'rev-parse', 'HEAD'); 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'], + ['deepen PR HEAD', 'fetch', '--no-tags', '--deepen=1000', 'origin', headSha], ]; if (gitTrim(cwd, 'rev-parse', '--is-shallow-repository') === 'true') { strategies.push(['unshallow', 'fetch', '--no-tags', '--unshallow', 'origin']);