# Requirement Specification / 需求规格说明

# git-rewrite-ignore

## Background / 背景

在 Git 项目开发过程中，有时会不小心将应被忽略的文件（如编译产物、日志文件、IDE 配置等）提交到版本库。即使后来在 .gitignore 中添加了这些文件的忽略规则，这些文件仍会保留在 Git 历史记录中，导致仓库体积膨胀，且敏感信息可能泄露。需要一个工具来彻底从 Git 历史中移除这些已被忽略但仍在跟踪的文件。

## Goals / 目标

- [x] 实现从 Git 历史中移除当前被 .gitignore 忽略的文件
- [x] 使用 git filter-branch 重写所有分支和标签的历史
- [x] 支持 --yes 参数跳过确认提示

## Scope / 范围

### In Scope / 范围内

- 检测当前仓库中被忽略但仍被跟踪的文件
- 使用 git filter-branch 从所有历史提交中移除这些文件
- 重写所有分支和标签
- 操作前进行危险操作确认
- 备份并恢复工作目录中的忽略文件
- 提示用户如何清理备份引用

### Out of Scope / 范围外

- 使用 git-filter-repo (需要额外安装)
- 自动推送重写后的历史到远程
- 自动清理备份引用
- 批量处理多个仓库

## Constraints / 约束条件

- 依赖系统已安装的 git 命令
- 必须在 Git 仓库内执行
- 自动切换到仓库根目录执行
- 操作具有破坏性，无法轻松撤销

## Acceptance Criteria / 验收标准

- [x] `l git rewrite-ignore` 能检测并列出被忽略但跟踪的文件
- [x] 无忽略文件时正确提示并退出
- [x] 默认需要用户确认才执行重写
- [x] `l git rewrite-ignore -y` 能跳过确认直接执行
- [x] 重写后文件从 Git 历史中完全移除
- [x] 重写后工作目录中的文件被正确恢复

## Implementation / 实现

- **文件**: `src/commands/git/rewrite_ignore.rs`
- **命令**: `l git rewrite-ignore [-y]`
- **参数**:
  - `-y, --yes`: 跳过确认提示，直接执行
- **流程**:
  1. 检查 git 是否可用
  2. 定位并切换到 git 仓库根目录
  3. 使用 `git ls-files -ci --exclude-standard` 获取忽略但跟踪的文件列表
  4. 显示文件列表并请求确认（除非使用 -y）
  5. 备份工作目录中的忽略文件到临时目录
  6. 执行 `git filter-branch --index-filter` 重写历史
  7. 从临时目录恢复文件到工作目录
  8. 提示用户如何清理备份引用
- **状态**: ✅ 已完成

## Open Questions / 待澄清问题

- (无)
