<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>开发安全 on KnightLi的博客</title>
        <link>https://knightli.com/tags/%E5%BC%80%E5%8F%91%E5%AE%89%E5%85%A8/</link>
        <description>Recent content in 开发安全 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Fri, 10 Jul 2026 11:48:09 +0800</lastBuildDate><atom:link href="https://knightli.com/tags/%E5%BC%80%E5%8F%91%E5%AE%89%E5%85%A8/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>AI 编程如何避免误删文件：从 Git、权限到恢复流程</title>
        <link>https://knightli.com/2026/07/10/ai-coding-avoid-accidental-file-deletion/</link>
        <pubDate>Fri, 10 Jul 2026 11:48:09 +0800</pubDate>
        
        <guid>https://knightli.com/2026/07/10/ai-coding-avoid-accidental-file-deletion/</guid>
        <description>&lt;p&gt;AI 编程最吓人的事故，不一定是代码写错，而是文件被删了。&lt;/p&gt;
&lt;p&gt;尤其是 Codex、Claude Code、Cursor 这类工具已经能读写项目文件、执行命令、批量重构、移动目录。一旦上下文理解错了，或者用户给了过宽的权限，它可能真的会删除文件、覆盖配置、清空生成物，甚至把还没提交的改动一起处理掉。&lt;/p&gt;
&lt;p&gt;所以使用 AI 编程工具时，第一条安全原则不是“让它更聪明”，而是：&lt;strong&gt;让它没有机会在错误范围里做破坏性操作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章整理一套实用流程，目标很简单：减少 AI 编程误删文件的概率，并且在真的删错时能快速恢复。&lt;/p&gt;
&lt;h2 id=&#34;先给结论防误删要靠多层保护&#34;&gt;先给结论：防误删要靠多层保护
&lt;/h2&gt;&lt;p&gt;不要把安全寄托在一句“不要删除文件”上。更稳的做法是叠几层保护：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;防护层&lt;/th&gt;
          &lt;th&gt;做什么&lt;/th&gt;
          &lt;th&gt;解决什么问题&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Git 工作区&lt;/td&gt;
          &lt;td&gt;改动前先看 &lt;code&gt;git status&lt;/code&gt;，重要节点小步提交&lt;/td&gt;
          &lt;td&gt;误删后能恢复&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工作目录隔离&lt;/td&gt;
          &lt;td&gt;只让 AI 在当前项目或临时分支里操作&lt;/td&gt;
          &lt;td&gt;避免碰到无关资料&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;危险命令确认&lt;/td&gt;
          &lt;td&gt;删除、覆盖、批量移动前必须人工确认&lt;/td&gt;
          &lt;td&gt;防止模型自动执行破坏性命令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;只读审查&lt;/td&gt;
          &lt;td&gt;先让 AI 分析影响面，不直接改&lt;/td&gt;
          &lt;td&gt;降低大范围误操作&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;忽略规则&lt;/td&gt;
          &lt;td&gt;把缓存、构建产物、密钥、数据目录排除&lt;/td&gt;
          &lt;td&gt;防止把不该碰的文件纳入任务&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;恢复流程&lt;/td&gt;
          &lt;td&gt;准备 &lt;code&gt;git restore&lt;/code&gt;、回收站、备份和快照&lt;/td&gt;
          &lt;td&gt;出事后不慌&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最重要的是：&lt;strong&gt;AI 能改文件之前，项目必须有可恢复的状态。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;最容易误删的几种场景&#34;&gt;最容易误删的几种场景
&lt;/h2&gt;&lt;p&gt;AI 编程误删文件通常不是突然发生的，而是来自几类常见指令。&lt;/p&gt;
&lt;h3 id=&#34;1-帮我清理项目&#34;&gt;1. “帮我清理项目”
&lt;/h3&gt;&lt;p&gt;这句话风险很高。&lt;/p&gt;
&lt;p&gt;AI 可能会把它理解成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除未引用的文件；&lt;/li&gt;
&lt;li&gt;删除旧组件；&lt;/li&gt;
&lt;li&gt;删除重复脚本；&lt;/li&gt;
&lt;li&gt;删除看起来没用的 Markdown；&lt;/li&gt;
&lt;li&gt;清理 &lt;code&gt;tmp&lt;/code&gt;、&lt;code&gt;dist&lt;/code&gt;、&lt;code&gt;build&lt;/code&gt;、&lt;code&gt;public&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;合并目录后删除原目录。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但真实项目里，“看起来没用”和“真的没用”差别很大。有些文件只在 CI、部署脚本、文档站、动态加载、插件机制里被引用，简单 grep 不一定能查到。&lt;/p&gt;
&lt;p&gt;更安全的说法是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;先只列出你认为可以清理的文件和原因，不要删除。等我确认后再处理。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-重构一下目录结构&#34;&gt;2. “重构一下目录结构”
&lt;/h3&gt;&lt;p&gt;移动文件比修改代码更危险，因为它会影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;import 路径；&lt;/li&gt;
&lt;li&gt;静态资源路径；&lt;/li&gt;
&lt;li&gt;Hugo、Next.js、Vite 等框架的约定目录；&lt;/li&gt;
&lt;li&gt;CI/CD 脚本；&lt;/li&gt;
&lt;li&gt;文档链接；&lt;/li&gt;
&lt;li&gt;多语言内容；&lt;/li&gt;
&lt;li&gt;部署产物。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果 AI 同时移动目录、修改引用、删除旧目录，一旦中间理解错，很难判断到底哪一步造成问题。&lt;/p&gt;
&lt;p&gt;更安全的流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先生成迁移计划。&lt;/li&gt;
&lt;li&gt;列出会移动的文件。&lt;/li&gt;
&lt;li&gt;列出会改的引用。&lt;/li&gt;
&lt;li&gt;小批量执行。&lt;/li&gt;
&lt;li&gt;每批后跑检查。&lt;/li&gt;
&lt;li&gt;确认无误后再删除旧路径。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;3-把没用的都删掉&#34;&gt;3. “把没用的都删掉”
&lt;/h3&gt;&lt;p&gt;这是最危险的提示词之一。&lt;/p&gt;
&lt;p&gt;“没用”必须有判断标准。否则 AI 可能根据文件名、更新时间、搜索结果来猜。对于动态项目，这种猜测经常错。&lt;/p&gt;
&lt;p&gt;建议改成：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请只找出没有被静态引用的候选文件，按风险分级列出来，不要删除。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后再让它补充：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;这些文件是否可能被运行时动态加载、配置文件引用、构建脚本引用或部署流程使用？
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第一步改动前必须看-git-状态&#34;&gt;第一步：改动前必须看 Git 状态
&lt;/h2&gt;&lt;p&gt;AI 动手前，先看：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果工作区已经有很多未提交改动，风险会变高。因为 AI 误删后，你很难区分哪些是它删的，哪些是你之前改的。&lt;/p&gt;
&lt;p&gt;推荐规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;干净工作区：适合让 AI 修改。&lt;/li&gt;
&lt;li&gt;少量已知改动：可以继续，但要明确“不要碰这些文件”。&lt;/li&gt;
&lt;li&gt;大量未提交改动：先提交、stash 或备份，再让 AI 做大改。&lt;/li&gt;
&lt;li&gt;有重要未跟踪文件：先确认是否要纳入 Git，别让 AI 当成垃圾文件删掉。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特别注意未跟踪文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? notes.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? scripts/new-tool.ps1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? content/post/2026/07/41/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这些文件不在 Git 历史里。它们被删后，&lt;code&gt;git restore&lt;/code&gt; 救不回来。对 AI 来说，未跟踪文件尤其危险，因为它可能把它们当作临时产物。&lt;/p&gt;
&lt;h2 id=&#34;第二步用小步提交给自己留恢复点&#34;&gt;第二步：用小步提交给自己留恢复点
&lt;/h2&gt;&lt;p&gt;在让 AI 做大改前，先做一个安全提交：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;chore: save working state before ai changes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你不想正式提交，也可以临时 stash：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git stash push -u -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;before ai changes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里的 &lt;code&gt;-u&lt;/code&gt; 很重要，它会把未跟踪文件也一起保存。否则新建但未提交的文件仍然可能丢。&lt;/p&gt;
&lt;p&gt;不过日常更推荐小步提交，而不是长期依赖 stash。提交记录可见、可比较、可回滚，更适合真实项目。&lt;/p&gt;
&lt;h2 id=&#34;第三步把-ai-限制在正确目录里&#34;&gt;第三步：把 AI 限制在正确目录里
&lt;/h2&gt;&lt;p&gt;不要在用户目录、下载目录、桌面根目录直接打开 AI 编程工具。&lt;/p&gt;
&lt;p&gt;更安全的做法是只在项目根目录里运行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; C:&lt;span class=&#34;se&#34;&gt;\W&lt;/span&gt;ork&lt;span class=&#34;se&#34;&gt;\m&lt;/span&gt;y-project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后明确告诉 AI：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;只允许修改当前仓库里的文件。不要读取或修改仓库外路径。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果任务涉及生成临时文件，可以指定一个目录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;所有临时文件都放到 tmp/ai-work/，不要在其他目录创建或删除临时文件。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;对于风险更高的改动，可以使用 Git worktree 或临时克隆：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git worktree add ../my-project-ai-test -b ai-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样 AI 在独立目录里工作，即使改乱了，也不会直接破坏主工作区。&lt;/p&gt;
&lt;h2 id=&#34;第四步给危险命令设人工确认&#34;&gt;第四步：给危险命令设人工确认
&lt;/h2&gt;&lt;p&gt;AI 编程里最需要警惕的是这些命令类型：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;del /s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Remove-Item -Recurse
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clean -fd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git reset --hard
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -- .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;robocopy /MIR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsync --delete
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它们不是一定不能用，但必须知道目标路径、影响范围和恢复方式。&lt;/p&gt;
&lt;p&gt;尤其是 Windows PowerShell 里的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Recurse&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这类命令在路径变量算错时非常危险。AI 如果用字符串拼命令、批量枚举路径再删除，很容易扩大范围。&lt;/p&gt;
&lt;p&gt;更安全的要求是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;遇到删除、覆盖、批量移动、git reset、git clean、rsync --delete 这类操作时，先停下来说明目标路径和影响范围，等我确认。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果工具支持权限模式，不要一上来给全自动写入和执行权限。日常开发建议保留确认步骤，尤其是涉及删除和覆盖时。&lt;/p&gt;
&lt;h2 id=&#34;第五步先审查再删除&#34;&gt;第五步：先审查，再删除
&lt;/h2&gt;&lt;p&gt;AI 很适合帮你找“候选删除项”，但不应该直接决定删除。&lt;/p&gt;
&lt;p&gt;可以让它输出一个清单：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件&lt;/th&gt;
          &lt;th&gt;AI 判断原因&lt;/th&gt;
          &lt;th&gt;风险等级&lt;/th&gt;
          &lt;th&gt;是否建议删除&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;old-script.js&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;没有静态引用&lt;/td&gt;
          &lt;td&gt;中&lt;/td&gt;
          &lt;td&gt;需人工确认&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dist/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;构建产物&lt;/td&gt;
          &lt;td&gt;低&lt;/td&gt;
          &lt;td&gt;可删除但需确认&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;legacy-config.json&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;名称像旧配置&lt;/td&gt;
          &lt;td&gt;高&lt;/td&gt;
          &lt;td&gt;不建议直接删&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;然后继续追问：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请检查这些文件是否可能被配置文件、CI、部署脚本、动态 import、文档链接或外部系统引用。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;只有当证据足够明确时，再做删除。&lt;/p&gt;
&lt;p&gt;如果你在用 Claude Code subagent，可以专门建一个只读 &lt;code&gt;cleanup-reviewer&lt;/code&gt;，只允许它列候选文件，不允许修改。关于 subagent 适合什么项目，可以看：/2026/07/10/claude-code-subagent-project-fit-guide/。&lt;/p&gt;
&lt;h2 id=&#34;第六步把项目规则写进-ai-记忆文件&#34;&gt;第六步：把项目规则写进 AI 记忆文件
&lt;/h2&gt;&lt;p&gt;如果你经常使用 AI 编程工具，建议在项目里写一个给 AI 看的规则文件，比如 &lt;code&gt;AGENTS.md&lt;/code&gt;、&lt;code&gt;CLAUDE.md&lt;/code&gt; 或工具支持的项目说明文件。&lt;/p&gt;
&lt;p&gt;可以加入这样的约束：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# File Safety Rules
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Do not delete files unless the user explicitly asks for deletion.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Before deleting, moving, or overwriting files, list the exact paths and wait for confirmation.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Never run git reset --hard, git clean -fd, rm -rf, Remove-Item -Recurse, rsync --delete, or robocopy /MIR without explicit confirmation.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Do not modify files outside the repository root.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Treat untracked files as user-created files, not disposable temporary files.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Prefer small edits and small commits.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;中文项目也可以直接写中文：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# 文件安全规则
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 不要主动删除文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 删除、移动、覆盖前，必须先列出完整路径和原因。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 未跟踪文件默认视为用户文件，不要当成临时文件处理。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 不要执行 &lt;span class=&#34;sb&#34;&gt;`git reset --hard`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`git clean -fd`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`Remove-Item -Recurse`&lt;/span&gt; 等破坏性命令，除非用户明确确认。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 不要修改仓库外的文件。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这类规则不能保证 100% 不出错，但能显著减少 AI 自作主张。&lt;/p&gt;
&lt;p&gt;如果你已经在整理多项目记忆，可以把“哪些目录不能碰、哪些命令必须确认、哪些文件是生成物”放进项目级记忆。相关方法可以参考：/2026/07/08/claude-code-multi-project-memory-team-workflow/。&lt;/p&gt;
&lt;h2 id=&#34;第七步区分源码生成物和用户资料&#34;&gt;第七步：区分源码、生成物和用户资料
&lt;/h2&gt;&lt;p&gt;很多误删来自“文件性质不清”。&lt;/p&gt;
&lt;p&gt;建议在项目里明确区分：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;类型&lt;/th&gt;
          &lt;th&gt;示例&lt;/th&gt;
          &lt;th&gt;AI 能不能删&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;源码&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;app/&lt;/code&gt;, &lt;code&gt;content/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;不能直接删&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;配置&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.env.example&lt;/code&gt;, &lt;code&gt;config/&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;高风险&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;生成物&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;dist/&lt;/code&gt;, &lt;code&gt;build/&lt;/code&gt;, &lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;可重建时才可删&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;缓存&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.cache/&lt;/code&gt;, &lt;code&gt;.next/cache/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;通常可删&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;用户资料&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;uploads/&lt;/code&gt;, &lt;code&gt;data/&lt;/code&gt;, &lt;code&gt;notes/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;默认禁止&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;本地密钥&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;*.key&lt;/code&gt;, &lt;code&gt;secrets/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;默认禁止读取和修改&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;不要让 AI 通过文件名猜。最好在 README 或 AI 规则文件里写清楚：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Directory Notes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`content/`&lt;/span&gt; is source content. Do not delete posts.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`public/`&lt;/span&gt; is generated by Hugo and can be rebuilt.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`.env`&lt;/span&gt; and &lt;span class=&#34;sb&#34;&gt;`secrets/`&lt;/span&gt; must not be read or modified.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`tmp/ai-work/`&lt;/span&gt; is the only allowed temporary workspace.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样 AI 做清理时更不容易误判。&lt;/p&gt;
&lt;h2 id=&#34;第八步恢复流程要提前会&#34;&gt;第八步：恢复流程要提前会
&lt;/h2&gt;&lt;p&gt;真的误删了，先别继续让 AI 大量修改。越继续改，越难恢复。&lt;/p&gt;
&lt;h3 id=&#34;恢复已跟踪文件&#34;&gt;恢复已跟踪文件
&lt;/h3&gt;&lt;p&gt;如果文件已经被 Git 跟踪，可以先看状态：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;恢复单个文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;恢复整个目录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore path/to/directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;恢复到某个提交版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore --source HEAD~1 path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;找回被删除但-git-里存在的文件&#34;&gt;找回被删除但 Git 里存在的文件
&lt;/h3&gt;&lt;p&gt;查看最近提交：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log -- path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从某个提交恢复：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore --source &amp;lt;commit&amp;gt; path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;误删未跟踪文件怎么办&#34;&gt;误删未跟踪文件怎么办
&lt;/h3&gt;&lt;p&gt;未跟踪文件不在 Git 里，恢复更麻烦。可以按顺序检查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编辑器本地历史；&lt;/li&gt;
&lt;li&gt;Windows 回收站；&lt;/li&gt;
&lt;li&gt;OneDrive、Dropbox、Syncthing 等同步工具的版本记录；&lt;/li&gt;
&lt;li&gt;NAS 快照或备份；&lt;/li&gt;
&lt;li&gt;文件恢复工具；&lt;/li&gt;
&lt;li&gt;AI 对话记录里是否还保留了内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这也是为什么大改前要先提交或 &lt;code&gt;git stash push -u&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;第九步让-ai-每次删除前输出差异&#34;&gt;第九步：让 AI 每次删除前输出差异
&lt;/h2&gt;&lt;p&gt;删除文件前，要求 AI 先展示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git diff --stat
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;并解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哪些文件会被删除；&lt;/li&gt;
&lt;li&gt;哪些文件会被移动；&lt;/li&gt;
&lt;li&gt;哪些文件只是修改；&lt;/li&gt;
&lt;li&gt;哪些是未跟踪文件；&lt;/li&gt;
&lt;li&gt;删除后如何恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果看到这样的状态，要特别小心：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;D  src/important.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; D content/post/2026/07/old/index.zh-cn.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? backup/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;D&lt;/code&gt; 表示 Git 跟踪的文件被删除。&lt;code&gt;??&lt;/code&gt; 表示未跟踪文件，Git 不会自动帮你恢复。&lt;/p&gt;
&lt;p&gt;AI 做完改动后，也应该再看一次：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不要只看它的文字总结。&lt;/p&gt;
&lt;h2 id=&#34;第十步不同工具的防护思路&#34;&gt;第十步：不同工具的防护思路
&lt;/h2&gt;&lt;p&gt;不管你用 Codex、Claude Code、Cursor 还是其他 Agent 工具，原则都差不多。&lt;/p&gt;
&lt;h3 id=&#34;codex&#34;&gt;Codex
&lt;/h3&gt;&lt;p&gt;适合做仓库级修改，但要注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开始前看 &lt;code&gt;git status&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;明确禁止删除未跟踪文件；&lt;/li&gt;
&lt;li&gt;大改前先让它给计划；&lt;/li&gt;
&lt;li&gt;遇到 &lt;code&gt;Remove-Item&lt;/code&gt;、&lt;code&gt;rm -rf&lt;/code&gt;、&lt;code&gt;git clean&lt;/code&gt;、&lt;code&gt;git reset&lt;/code&gt; 要停下来确认；&lt;/li&gt;
&lt;li&gt;让它最终汇报实际改了哪些文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;claude-code&#34;&gt;Claude Code
&lt;/h3&gt;&lt;p&gt;适合终端内长任务和项目工作流。建议：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把文件安全规则写进 &lt;code&gt;CLAUDE.md&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;用 subagent 做只读审查，不让审查角色直接删文件；&lt;/li&gt;
&lt;li&gt;使用 hooks 时避免自动触发破坏性脚本；&lt;/li&gt;
&lt;li&gt;明确哪些命令需要人工确认。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cursor--ide-类工具&#34;&gt;Cursor / IDE 类工具
&lt;/h3&gt;&lt;p&gt;IDE 工具有可视化 diff，但也容易批量接受修改。建议：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要一次性接受大范围删除；&lt;/li&gt;
&lt;li&gt;先看文件树变化；&lt;/li&gt;
&lt;li&gt;对删除文件逐个确认；&lt;/li&gt;
&lt;li&gt;重要项目仍然以 Git 为准，不只依赖 IDE 的撤销。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;一套安全提示词模板&#34;&gt;一套安全提示词模板
&lt;/h2&gt;&lt;p&gt;以后让 AI 做清理、重构、迁移时，可以直接用这段：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请先分析，不要修改文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;目标：找出这次任务可能需要修改、移动或删除的文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;要求：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 不要删除任何文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 不要执行 git reset、git clean、rm -rf、Remove-Item -Recurse、rsync --delete、robocopy /MIR。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 未跟踪文件默认视为用户文件，不要当作临时文件处理。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4. 先输出计划、影响范围和风险点。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5. 如果确实建议删除文件，列出完整路径、原因、风险等级和恢复方式，等待我确认。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;真正要执行时，再给第二段：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;只执行我确认过的这些文件操作。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;每次删除或移动前，再输出目标路径。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;完成后运行 git status --short，并汇报新增、修改、删除的文件。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个模板不复杂，但能拦住很多误删事故。&lt;/p&gt;
&lt;h2 id=&#34;最后ai-编程不是不删文件而是可控地删&#34;&gt;最后：AI 编程不是不删文件，而是可控地删
&lt;/h2&gt;&lt;p&gt;项目里确实会有需要删除文件的时候：废弃组件、旧脚本、重复资源、过期文档、构建缓存，都可能需要清理。&lt;/p&gt;
&lt;p&gt;关键不在于永远不删，而在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除前有证据；&lt;/li&gt;
&lt;li&gt;删除前有清单；&lt;/li&gt;
&lt;li&gt;删除前有确认；&lt;/li&gt;
&lt;li&gt;删除后能验证；&lt;/li&gt;
&lt;li&gt;出错后能恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI 编程越强，越要把文件安全当作工作流的一部分。Git、小步提交、只读审查、权限确认、项目规则和备份恢复，这些看起来有点啰嗦，但它们能把“误删文件”从灾难变成一个可回滚的小事故。&lt;/p&gt;
&lt;p&gt;如果你的 AI Agent 经常跑长任务，还可以把每个阶段的状态、改动范围和恢复点写清楚，减少中断后重复执行危险命令。这个方向可以继续看：/2026/07/10/ai-agent-long-task-resume-guide/。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
