[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-codex-override-file-team-safety-en":3,"article-related-codex-override-file-team-safety-en":30,"series-tools-f13eeb6f-828b-47f1-bffa-ce23f2039ede":75},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"f13eeb6f-828b-47f1-bffa-ce23f2039ede","codex-override-file-team-safety-en","Codex 的 override 文件让团队少踩坑","\u003Cp data-speakable=\"summary\">把 \u002FAGENTS.override.md 加进 .gitignore，就能把 \u003Ca href=\"\u002Ftag\u002Fcodex\">Codex\u003C\u002Fa> 的团队覆盖配置管住。\u003C\u002Fp>\u003Cp>我用 Codex 工作区一段时间了，整体挺顺手，但有个地方一直让我烦：团队里一旦有人临时改了 AGENTS 相关配置，那个“临时”经常就变成了“谁也不知道还在不在”的状态。你以为自己在跑同一套规则，实际上有人本地多了个 override，另一个人没加载到，第三个人还把它顺手提交进去了。结果就是，排查问题的时候大家都在对着同一个仓库说不同的话。\u003C\u002Fp>\u003Cp>这类问题最恶心的点不在于它难修，而在于它很容易被忽略。配置文件一旦能被版本库追踪，团队就会下意识把它当成正式约定；可有些文件本来就该是本地实验用的，像 \u003Ccode>\u002FAGENTS.override.md\u003C\u002Fcode> 这种东西，应该更像“我这台机器上的临时补丁”，而不是项目规范的一部分。知乎上这篇\u003Ca href=\"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F2048777578488632049\">关于 Codex 在符号链接工作区里无法加载 AGENTS.md 的修复说明\u003C\u002Fa>，把这个思路说得很直接：把覆盖文件放进 \u003Ccode>.gitignore\u003C\u002Fcode>，再用自动升级把后续修复吃进来。这个判断我认同，因为它解决的不是单点 bug，而是团队里最烦人的配置漂移。\u003C\u002Fp>\u003Ch2>别把临时 override 养成“伪标准”\u003C\u002Fh2>\u003Cblockquote>把 \u003Ccode>\u002FAGENTS.override.md\u003C\u002Fcode> 加进 \u003Ccode>.gitignore\u003C\u002Fcode>。\u003C\u002Fblockquote>\u003Cp>这句话看着简单，实际很有分量。它的意思不是“别用 override”，而是“override 可以存在，但别让它进入仓库的正式轨道”。我见过太多团队把临时调试文件、个人实验配置、阶段性 workaround 留在 repo 里，最后每个人都以为那是项目的一部分。等到某天有人清理文件，或者切到别的分支，问题就开始了：为什么这个 \u003Ca href=\"\u002Ftag\u002Fagent\">agent\u003C\u002Fa> 读不到规则？为什么本地表现和 CI 不一样？为什么 A 说能复现，B 说不能？\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781712203131-p9n8.png\" alt=\"Codex 的 override 文件让团队少踩坑\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>把 \u003Ccode>\u002FAGENTS.override.md\u003C\u002Fcode> 放进 \u003Ccode>.gitignore\u003C\u002Fcode> 的价值就在这里。它把“这个文件可以存在”跟“这个文件应该被提交”分开了。前者允许你做本地实验，后者阻止它污染共享状态。说白了，这就是给团队装一个边界。你可以改，但别把改动伪装成正式配置。\u003C\u002Fp>\u003Cp>我自己最怕的就是那种看起来像文档、实际上是补丁的文件。它们最开始都很无辜，后来就会变成事故现场。今天是为了修一个符号链接工作区的问题，明天就是某个人在别的目录里复制了一份，后天你再看，仓库里已经有三份“看起来差不多”的规则文件了。\u003C\u002Fp>\u003Cp>怎么落地？很简单。把它当作本地覆盖层来处理，不要让它跟主配置混在一起。然后在 README 或团队约定里明确一句：\u003Ccode>AGENTS.override.md\u003C\u002Fcode> 只给个人调试、临时实验、局部修补用，不进入正式提交流程。这样做的好处是，团队成员看到这个文件时会下意识知道它不是“标准答案”。\u003C\u002Fp>\u003Cul>\u003Cli>把本地覆盖文件加入 \u003Ccode>.gitignore\u003C\u002Fcode>。\u003C\u002Fli>\u003Cli>在团队规范里说明它只用于临时调试。\u003C\u002Fli>\u003Cli>不要让 CI、发布脚本、正式文档去依赖它。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>git status 该替你报警，不该替你装瞎\u003C\u002Fh2>\u003Cp>我很喜欢这个修法里的另一个细节：把新建的 override 文件交给 \u003Ccode>git status\u003C\u002Fcode> 去暴露，而不是藏起来。很多人对 \u003Ccode>.gitignore\u003C\u002Fcode> 有误解，以为它的作用就是“让文件消失”。其实更好的用法是：让该消失的东西消失，让该出现的风险出现。这里的逻辑非常朴素，甚至有点土，但土办法往往最管用。\u003C\u002Fp>\u003Cp>如果一个同事在本地临时加了 \u003Ccode>\u002FAGENTS.override.md\u003C\u002Fcode>，而这个文件又没有被忽略，那它就很容易被误提交。你今天只是想修个 bug，明天仓库里就多了一个没人注意的本地配置。相反，如果它被 \u003Ccode>.gitignore\u003C\u002Fcode> 管住了，\u003Ccode>git status\u003C\u002Fcode> 还能保持干净，真正需要提交的改动也更容易被看见。这个时候，状态输出不是噪音，而是提醒。\u003C\u002Fp>\u003Cp>我在团队里吃过一次类似的亏。我们当时有个本地调试用的配置文件没忽略，结果一位同事在赶工时顺手提交了。那次提交没炸，但它把一种“本地例外”变成了“仓库默认”。之后每个人都得先理解那份例外，再去判断自己的问题是不是跟它有关。很浪费时间，也很伤协作信任。\u003C\u002Fp>\u003Cp>怎么应用？我会建议你把这类文件的处理原则写成两条：第一，默认不提交；第二，如果真的需要共享，就显式改成正式配置文件，而不是继续靠 override 混过去。这样团队成员在看到 \u003Ccode>git status\u003C\u002Fcode> 时，心里会很清楚哪些是临时件，哪些是正式件。\u003C\u002Fp>\u003Cul>\u003Cli>让 \u003Ccode>git status\u003C\u002Fcode> 只暴露真正需要处理的内容。\u003C\u002Fli>\u003Cli>把临时 override 和正式配置分开命名。\u003C\u002Fli>\u003Cli>如果要共享，迁移到明确的主配置文件里。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>符号链接工作区的问题，本质上是“发现机制”出了偏差\u003C\u002Fh2>\u003Cblockquote>Codex AGENTS.md 在符号链接工作区无法加载的问题已在 v0.138 版本中修复。\u003C\u002Fblockquote>\u003Cp>这条信息很关键，因为它说明问题不只是“某个文件读不到”，而是“在特定工作区结构下，发现机制失效了”。符号链接工作区本来就容易把路径、根目录、相对引用这些东西搞复杂。工具如果只按最朴素的文件系统假设去找，就很容易在链接层上翻车。你看着文件明明在那儿，它就是不认；你换个路径，又突然好了。最烦的就是这种“看起来没问题，但就是不工作”的毛病。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781712202044-h75u.png\" alt=\"Codex 的 override 文件让团队少踩坑\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>我理解这类修复的重点，不是让你手工绕开，而是让工具学会在真实工作区里找对位置。对开发者来说，这意味着你以后不用为了符号链接工作区专门写一堆脆弱的 workaround。更重要的是，它把“文件存在”跟“文件被正确发现”这两个概念分开了。很多工具栽就栽在这里：它们以为自己在读配置，其实只是在读一个理想化的目录结构。\u003C\u002Fp>\u003Cp>我自己在 monorepo、pnpm workspace、link 目录混用的时候，最讨厌的就是这种路径感知问题。你只要把仓库换成一个符号链接入口，很多工具就开始表现得像第一次见到这个项目。表面上是 bug，底层其实是路径解析太天真。v0.138 修掉这个点，至少说明 Codex 的工作区发现逻辑开始更贴近真实开发环境了。\u003C\u002Fp>\u003Cp>怎么用这个信息指导你自己的项目？如果你也在做 agent、CLI 或代码工具，别假设用户总是在“标准仓库根目录”里跑你。真实世界里，别人会从符号链接、挂载目录、容器卷、子目录入口启动。你要么支持这些入口，要么就老老实实把限制写清楚。含糊其辞最坑人。\u003C\u002Fp>\u003Cp>如果你是使用者，那就顺手做一个验证：在符号链接工作区里确认 Codex 能不能找到 AGENTS 文件，确认 override 是否按预期生效。别等到团队跑偏了才发现问题。\u003C\u002Fp>\u003Ch2>自动升级比人工盯版本靠谱得多\u003C\u002Fh2>\u003Cp>这篇内容里我最认同的一点，是把修复和升级策略绑在一起看，而不是只看 bug 本身。单独修一次版本问题，当然能救急；但如果团队还停在旧版本上，那修复就只是“某个人已经知道了”，不是“整个团队已经拿到了”。这就是为什么我一直更喜欢把工具升级交给 Renovate 或 Dependabot，而不是靠人肉提醒。\u003C\u002Fp>\u003Cp>这里的逻辑很现实：Codex 这类工具的行为修复，往往不是一次性的。今天是符号链接工作区，明天可能是别的路径发现问题，后天可能又是配置优先级调整。你不可能指望每个开发者都盯着发布说明，也不该这么要求。自动升级至少能保证一个基本事实：新修复会更快进入团队的日常环境。\u003C\u002Fp>\u003Cp>我见过很多团队嘴上说“我们会定期升级”，实际上就是等到有人碰到 bug 才想起来看版本。这个模式很脆。你要是今天不自动化，明天就会在 Slack 里反复问“谁能顺手升一下”。然后一拖再拖，最后变成“先别升，等这个分支合完”。结果就是，已知修复被你们自己拖成了未知风险。\u003C\u002Fp>\u003Cp>怎么做？如果你用 \u003Ca href=\"\u002Ftag\u002Fgithub\">GitHub\u003C\u002Fa>，可以看 \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Fdependabot\">Dependabot\u003C\u002Fa>；如果你们已经在用 Renovate，就直接给 \u003Ccode>@\u003Ca href=\"\u002Ftag\u002Fopenai\">openai\u003C\u002Fa>\u002Fcodex\u003C\u002Fcode> 配规则。升级策略不需要花哨，核心是两点：尽快拿到修复，尽量减少人工判断成本。你甚至可以把它设成小步快跑，而不是大版本一次性跳跃。这样出问题时回滚也更简单。\u003C\u002Fp>\u003Cul>\u003Cli>用 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Frenovatebot\u002Frenovate\">Renovate\u003C\u002Fa> 或 Dependabot 自动提升级别。\u003C\u002Fli>\u003Cli>把 Codex 相关依赖纳入常规更新队列。\u003C\u002Fli>\u003Cli>优先接收修复型版本，别等到堆出一坨技术债。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>把“本地补丁”从“团队约定”里剥离出来\u003C\u002Fh2>\u003Cp>这其实是整件事最值得学的一点。\u003Ccode>AGENTS.override.md\u003C\u002Fcode> 这个命名本身就透露出意图：它不是主配置，它是覆盖层。覆盖层存在的意义，是让你在不改主配置的前提下做局部调整。可一旦你把它提交进仓库，它就不再只是覆盖层，而会变成一种隐式约定。隐式约定最可怕，因为它没有明确边界，也没有明确负责人。\u003C\u002Fp>\u003Cp>我更愿意把这类文件看成“个人工作台上的便签”，而不是“项目说明书的一部分”。个人便签可以很多，甚至可以很乱，但它们不该污染团队共识。团队共识应该尽可能少而清晰：哪些文件是正式的，哪些只是本地的，哪些能自动升级，哪些必须人工审查。边界越清楚，工具越不容易把人带沟里。\u003C\u002Fp>\u003Cp>落地的时候，我会建议你顺手把几件事一起做：\u003C\u002Fp>\u003Cul>\u003Cli>明确主配置文件和 override 文件的职责分工。\u003C\u002Fli>\u003Cli>给本地覆盖文件加 \u003Ccode>.gitignore\u003C\u002Fcode>。\u003C\u002Fli>\u003Cli>把工具版本升级纳入自动化流程。\u003C\u002Fli>\u003Cli>在团队文档里写明：符号链接工作区也要验证。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>这样一来，问题就不会被拆成零碎的“谁的机器坏了”“谁忘了提交”“谁没升级版本”，而是会回到一个更健康的状态：规则清楚，路径明确，升级自动化，临时补丁不乱飞。说到底，开发体验里最值钱的不是少敲几行字，而是少猜几次系统到底在干嘛。\u003C\u002Fp>\u003Ch2>你可以直接复制的团队约定\u003C\u002Fh2>\u003Cpre>\u003Ccode># Codex team setup: keep local overrides out of git, and auto-upgrade Codex\n\n## Files\n# Local-only override file for experiments and machine-specific fixes\n\u002FAGENTS.override.md\n\n## .gitignore\n# Keep local Codex overrides out of version control\n\u002FAGENTS.override.md\n\n## Team rule\n# - AGENTS.md is the shared source of truth\n# - AGENTS.override.md is local-only and must not be committed\n# - If an override needs to be shared, promote it into the main AGENTS.md\n\n## Verification checklist\n# 1. Open the workspace through a symlinked path\n# 2. Confirm Codex loads AGENTS.md correctly\n# 3. Create \u002FAGENTS.override.md locally\n# 4. Confirm git status stays clean for the override file\n# 5. Confirm the override is picked up only on the local machine\n\n## Renovate example\n{\n  \"packageRules\": [\n    {\n      \"matchPackageNames\": [\"@openai\u002Fcodex\"],\n      \"automerge\": false,\n      \"enabled\": true\n    }\n  ]\n}\n\n## Dependabot example\nversion: 2\nupdates:\n  - package-ecosystem: \"npm\"\n    directory: \"\u002F\"\n    schedule:\n      interval: \"weekly\"\n    allow:\n      - dependency-name: \"@openai\u002Fcodex\"\n\n## PR note\n# When Codex is updated, re-check:\n# - symlink workspace loading\n# - AGENTS discovery\n# - override precedence\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>我会把这份模板当成起点，而不是终点。你可以按自己的仓库结构改路径，按自己的包管理器改升级规则，但原则别变：本地 override 不进仓库，工具修复靠自动升级，符号链接工作区要单独验证。\u003C\u002Fp>\u003Cp>原始问题和修复点来自这篇知乎文章：\u003Ca href=\"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F2048777578488632049\">Codex AGENTS.md 在符号链接工作区无法加载的问题已在 v0.138 版本中修复\u003C\u002Fa>。我上面这套整理是基于它的实战化改写，不是原文逐字复述；真正的价值在于把修复变成团队能直接执行的约定。\u003C\u002Fp>","把 \u002FAGENTS.override.md 加进 .gitignore，再配自动升级 Codex，团队就能少踩配置坑。","zhuanlan.zhihu.com","https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F2048777578488632049",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781712203131-p9n8.png","tools","en","0d604975-3f39-4093-9a65-b47e4c6f5ccb",[17,18,19,20,21],"Codex","AGENTS.override.md","gitignore","Renovate","Dependabot",[23,24,25],"把 \u002FAGENTS.override.md 加进 .gitignore，避免本地实验污染仓库","用自动升级把 Codex 的修复尽快带进团队","在符号链接工作区单独验证 AGENTS 发现机制",0,"2026-06-17T16:02:50.475328+00:00","2026-06-17T16:02:50.466+00:00","e4b90b62-2711-4565-95f6-99074b613dde",{"tags":31,"relatedLang":34,"relatedPosts":38},[32],{"name":17,"slug":33},"codex",{"id":15,"slug":35,"title":36,"language":37},"codex-override-file-team-safety-zh","Codex override 文件让团队少踩坑","zh",[39,45,51,57,63,69],{"id":40,"slug":41,"title":42,"cover_image":43,"image_url":43,"created_at":44,"category":13},"cc4a6360-46f7-4cdd-b250-74e4474d0407","build-semantic-search-opensearch-vectors-en","Build semantic search with OpenSearch vectors","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781714885490-g1o1.png","2026-06-17T16:47:37.268089+00:00",{"id":46,"slug":47,"title":48,"cover_image":49,"image_url":49,"created_at":50,"category":13},"46e957eb-f078-4527-9f2b-e05e801998d8","zvec-turns-local-vector-search-into-a-library-en","Zvec turns local vector search into a library","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781714031518-cson.png","2026-06-17T16:33:24.445725+00:00",{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"2aa4df9d-e949-45c1-98b0-af8c8c0f799b","opencode-terminal-ai-coding-loop-en","OpenCode turns terminal chat into a coding loop","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781693306666-aejr.png","2026-06-17T10:47:58.91198+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"8f7dbc25-a9a2-4539-a4d1-8cd9932444e1","open-source-ai-software-infrastructure-wins-en","Open-source AI software is winning on infrastructure, not hype","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781691474026-aqqd.png","2026-06-17T10:17:27.28173+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"33c54a94-00ba-4029-bd8d-67b27812d487","wazero-turns-go-wasm-into-plain-go-en","Wazero turns Go Wasm into plain Go","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781681636537-3in0.png","2026-06-17T07:33:31.022165+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"e56db932-e6fe-4974-b25e-d5042045e07f","ffmpeg-webcli-browser-video-editor-en","ffmpeg-webCLI brings video editing into the browser","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781680690708-tcol.png","2026-06-17T07:17:40.984864+00:00",[76,81,86,91,96,101,106,111,116,121],{"id":77,"slug":78,"title":79,"created_at":80},"8008f1a9-7a00-4bad-88c9-3eedc9c6b4b1","surepath-ai-mcp-policy-controls-en","SurePath AI's New MCP Policy Controls Enhance AI Security","2026-03-26T01:26:52.222015+00:00",{"id":82,"slug":83,"title":84,"created_at":85},"27e39a8f-b65d-4f7b-a875-859e2b210156","mcp-standard-ai-tools-2026-en","MCP Standard in 2026: Integrating AI Tools","2026-03-26T01:27:43.127519+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"165f9a19-c92d-46ba-b3f0-7125f662921d","rag-2026-transforming-enterprise-ai-en","How RAG in 2026 is Transforming Enterprise AI","2026-03-26T01:28:11.485236+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"6a2a8e6e-b956-49d8-be12-cc47bdc132b2","mastering-ai-prompts-2026-guide-en","Mastering AI Prompts: A 2026 Guide for Developers","2026-03-26T01:29:07.835148+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"3ab2c67e-4664-4c67-a013-687a2f605814","garry-tan-open-sources-claude-code-toolkit-en","Garry Tan Open-Sources a Claude Code Toolkit","2026-03-26T08:26:20.245934+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"66a7cbf8-7e76-41d4-9bbf-eaca9761bf69","github-ai-projects-to-watch-in-2026-en","20 GitHub AI Projects to Watch in 2026","2026-03-26T08:28:09.752027+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"9f332fda-eace-448a-a292-2283951eee71","practical-github-guide-learning-ml-2026-en","A Practical GitHub Guide to Learning ML in 2026","2026-03-27T01:16:50.125678+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"1b1f637d-0f4d-42bd-974b-07b53829144d","aiml-2026-student-ai-ml-lab-repo-review-en","AIML-2026 Is a Bare-Bones Student Lab Repo","2026-03-27T01:21:51.661231+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"6d1bf3f6-e191-4d30-b55b-8a0722fa6afe","ai-trending-github-repos-and-research-feeds-en","AI Trending Tracks Repos and Research Feeds","2026-03-27T01:31:35.709532+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"010539a1-4c3a-4bd3-937a-26616422ee0d","awesome-ai-for-science-research-tools-map-en","Awesome AI for Science Is Becoming a Real Research Map","2026-03-27T01:46:50.89513+00:00"]