用途
setup-gitignore 用于初始化或幂等地修订当前仓库的 .gitignore 文件。它只处理当前仓库,绝不读写全局 excludesfile(如 ~/.gitignore、~/.config/git/ignore),也不会运行 git config --global。全局 excludesfile 负责跨机器的通用噪声,本技能负责当前仓库的语言/工具特定内容。
主要能力
技能按以下顺序组合来源:
- gitignore.io —— 依据检测到的语言/框架生成模板(需要网络)。
- AI 工具 —— 来自 references/AI-TOOLING.md 的内置模式。
- IDE / 编辑器 —— 来自 references/IDE-EDITOR.md 的内置模式。
- 经验性 —— 来自 git status 的未跟踪路径,需交互确认。
使用方式
工作流程如下:
- 检测仓库根目录:运行 git rev-parse --show-toplevel;若不在 git 仓库内则报错中止。
- 检测语言:读取 references/LANGUAGE-DETECTION.md 中的 manifest → gitignore.io key 对照表,扫描 manifest(fd --max-depth 2 -t f),匹配文件名并构建逗号分隔的 key 列表(如 rust,node,typescript)。若未检测到 manifest,则使用空 key 列表(内置区块仍然生效)。
- 快照现有 .gitignore:若存在,先备份,例如 cp .gitignore /tmp/gitignore-snapshot-$(date +%s).bak。
- 呈现经验性噪声:运行 git status -s -uall | rg '^??' | rg -v '^?? .gitignore',按顶层目录或扩展名聚类未跟踪路径,呈现给用户并等待明确确认。未经确认不得添加任何经验性模式。
- 组合:运行 scripts/compose-gitignore.sh <csv> 获取并合并 gitignore.io 模板。若网络调用失败,告知用户并询问是否仅使用内置模式继续。在 API 输出后按顺序追加内置区块:
=== AI TOOLING ===
<references/AI-TOOLING.md 的内容>
=== IDE / EDITOR ===
<references/IDE-EDITOR.md 的内容>
=== EMPIRICAL ===
<用户确认的模式,每行一个>
- 合并或初始化:若无现有 .gitignore,直接写入组合输出;若已存在,则幂等地合并每个 # === SECTION === 区块——文件中已存在的模式会被去重(首次出现优先)。保留区块标题之外的所有用户内容。通过 difft 展示完整差异,仅在用户确认后写入。
- 验证:运行 git status -s -uall | rg '^??' | wc -l,报告前后未跟踪数量,并列出仍未跟踪的路径,供用户决定是否添加更多模式。
适用场景
适用于需要为当前仓库建立或更新 .gitignore 的场景,尤其是希望结合语言/框架模板、AI 工具与 IDE 模式,以及实际未跟踪文件噪声的情况。
限制
仅作用于单个仓库,不处理全局 excludesfile。gitignore.io 模板获取需要网络,网络失败时需用户决定是否继续。经验性模式必须经用户明确确认后才能添加。幂等性契约:在已运行过本技能的仓库上重复运行不产生差异;区块标题作为稳定的合并锚点;区块外的用户内容永不被修改。