Communitygithub.com

文檔專用PR批量合併

將多個已審查的文檔專用拉取請求合併為一個草稿拉取請求。涵蓋即時狀態快照、跳過規則、基於每個來源頭部的逐PR提交、推送前的檢查以及描述的驗證區塊。

文檔專用PR批量合併 是什麼?

此技能旨在簡化多個小型文檔拉取請求的合併流程。它會將已審查通過的、僅修改文檔路徑的多個拉取請求的檔案內容,逐個提交複製到一個新的草稿拉取請求中。每個來源PR的檔案會原封不動地複製,來源PR本身不會受到任何操作影響。此技能支援GitHub平台,並整合了 `gh`(GitHub CLI)和 `git` 命令。其主要特色包括使用臨時工作樹以避免干擾當前工作目錄、對每個來源PR進行即時快照(包括狀態、基底分支、頭部提交和檔案列表)、內建嚴格的跳過規則(例如已關閉的PR、觸及文檔目錄以外路徑的PR、與主分支或其他開啟PR衝突的PR),以及在推送前進行變更路徑範圍檢查。最後,它會產生一個驗證區塊,逐一比對批次PR中每個檔案的內容與來源頭部提交的內容,確保完全一致,然後以草稿模式開啟新的PR。此流程確保任何有問題的來源PR都會中止整個運行,避免部分合併,並提供完整的跳過原因清單,讓審查者能做出最終決定。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/shagghiesuperstar/hermes-skills/tree/HEAD/skills/docs-pr-batch-landing

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

文檔專用PR批量合併 是做什麼的?

概述

將許多小型文檔拉取請求合併為一個批次進行審查會更有效率。本程序將多個已審查、僅限文檔的拉取請求中的檔案複製到一個新的草稿拉取請求中,每個來源請求對應一個提交。檔案內容會被精確複製,不做任何編輯。來源拉取請求保持不變。審查者隨後合併此批次拉取請求,而來源拉取請求會根據其自身狀態關閉,不經由此程序的任何操作。

使用時機

  • 多個開啟的文檔拉取請求已通過審查,且每個請求僅觸及文檔路徑。
  • 審查者要求將它們整合到一個拉取請求中。

請勿將其用於程式碼、配置,或用於任何尚未通過審查的來源拉取請求。

功能特色

  • 使用暫存工作樹,因此不會影響目前的工作目錄。
  • 對每個來源拉取請求的狀態、基底分支、頭部提交和檔案列表進行即時快照,並與已獲取的頭部提交進行比對。
  • 對已關閉、觸及文檔資料夾外部路徑、與主分支衝突、或與其他開啟拉取請求衝突的請求,設有跳過規則。
  • 每個合併的來源對應一個提交,並設有斷言,當來源有問題時會停止運行。
  • 在推送前對變更路徑進行檢查,以及一個驗證區塊,用於比對每個檔案的 blob 與其來源頭部。

優勢

  • 有問題的來源會中止運行,而不是部分合併。
  • 每個合併的檔案內容都證明與其來源相同。
  • 跳過的拉取請求會列出原因,因此不會無聲無息地遺漏任何項目。
  • 批次拉取請求以草稿模式開啟,因此最終決定權在審查者手中。

程序

  1. 在暫存工作樹中工作。 獲取主分支和來源拉取請求的頭部,然後在主分支上於暫存資料夾中建立一個新分支:

    git fetch origin main '+refs/pull/*/head:refs/remotes/origin/pr/*'
    git worktree add -b <batch-branch> <scratch-dir>/wt origin/main
    

    如果 HTTPS 獲取或推送因驗證失敗,請對該命令使用程式碼託管平台的 CLI 作為憑證助手來運行,例如 -c credential.helper= -c 'credential.helper=!gh auth git-credential'。請勿變更已儲存的配置,也請勿列印 token。

  2. 即時快照一次。 對於每個來源拉取請求,讀取其狀態、草稿標記、基底分支、頭部提交和檔案列表。同時列出開啟的拉取請求以進行衝突檢查。斷言每個來源的頭部提交等於已獲取的 refs/remotes/origin/pr/<n> 提交。

  3. 決定跳過或合併,按編號順序進行。 如果滿足以下任一條件,則跳過該拉取請求並記錄原因:

    • 它不是「開啟」狀態。
    • 其任何路徑位於文檔資料夾之外。
    • 其任何路徑已存在於主分支上。對於已存在於主分支的路徑,比較它的 blob。內容相同表示已早先合併。內容不同則需要重新基底。
    • 另一個開啟的拉取請求變更了其任何路徑。
  4. 將每個拉取請求作為一個提交合併。 對於每個合併的拉取請求,從其頭部提交中檢出檔案,並使用包含該拉取請求編號的訊息提交它們。在一個迴圈中運行此操作,該迴圈會斷言拉取請求是開啟的、頭部匹配、路徑位於文檔資料夾下,且均未出現在主分支上。斷言失敗會中止運行。

    git checkout <head-commit> -- <paths>
    git commit -m "docs: land #<n>"
    
  5. 在推送前檢查變更。 文檔資料夾之外的變更檔案數量必須為零。變更檔案的總數必須等於每個來源拉取請求的路徑計數總和。

  6. 建立驗證區塊。 對於每個拉取請求及其每個路徑,比較批次分支 HEAD 上的 blob 與來源頭部的 blob。為每個拉取請求列印一行,顯示其頭部、路徑計數、blob 計數和 MATCH,再加上總計。將該區塊原樣貼入批次拉取請求的描述中。

  7. 以草稿模式開啟批次拉取請求。 推送分支,然後針對主分支建立一個草稿。標題應說明實際合併的拉取請求數量,而非考慮的數量:

    gh pr create --draft --base main --title "docs: land <k> reviewed docs PRs" --body-file <body-file>
    
  8. 編寫描述。 包含一則說明,指出因為是僅文檔差異而跳過建置、已合併的拉取請求列表(含檔案計數和頭部)、跳過的拉取請求及其原因、給審查者的任何標記,以及驗證區塊。重新讀取新拉取請求的狀態,並確認它是針對主分支的草稿。

常見陷阱

  • 忽略草稿規則。 某次運行的指令可能要求建立一個「準備審查」的拉取請求。除非運行規則另有說明,否則請以草稿模式開啟,並在描述中說明。
  • 來源拉取請求基於另一個分支。 其檔案通過了所有路徑規則,但將它們合併到主分支會改變該拉取請求的意義。僅在規則允許的情況下才包含它,並用確切的待丟棄提交進行標記。
  • 無合併基底。 此類拉取請求的合併基底查找可能失敗,而與基底進行差異比較時會出錯。請使用即時檔案列表作為路徑來源。僅在存在合併基底時,才與其交叉檢查差異。
  • 部分合併。 一個修改了主分支上已有檔案的拉取請求,即使其其他檔案是新的,也可能被跳過。請勿部分合併它。
  • 以遺失路徑錯誤淹沒輸出。 檢查路徑是否存在於主分支時,每個遺失的路徑都會印出一個錯誤。在這些檢查中,請將標準錯誤重新導向到 /dev/null。
  • 填充最終報告。 報告中列出跳過的列表及其原因、標記和驗證總計。請勿列出每個檔案。
  • 缺失的圖形或索引。 如果儲存庫的程式碼智能索引不可用,請在報告中說明,並且不要跳過路徑規則。

驗證

  • 批次拉取請求是針對主分支的草稿。
  • 每個合併的檔案的 blob 與其來源頭部匹配,如驗證區塊所示。
  • 沒有變更的檔案位於文檔資料夾之外。
  • 每個跳過的拉取請求在描述中都有一個原因。
  • 來源拉取請求保持不變。此程序未對它們進行合併、批准、關閉或評論。

相關技能