公司里的 Claude Code 用久了以后,最容易烦人的地方不是它不会写代码,而是它经常停下来问权限:读个文件要不要允许,改个文件要不要允许,跑个 git status 要不要允许。项目本来就在自己电脑上,也有 Git 做版本兜底,每次都点确认,心流很容易被打断。
这类问题通常不是模型能力问题,而是 Claude Code 的权限策略在起作用。它默认把本地文件、Shell 命令、网络和敏感路径都当成需要确认的动作。这个设计是合理的,只是对固定可信项目来说,可以稍微配置得顺手一点。
优先用项目级配置,而不是全局放开
如果只是几个固定项目完全信任,建议优先在项目根目录放:
.claude/settings.local.json
settings.local.json 适合放个人机器上的偏好配置,不应该提交到 Git。这样每个项目可以按自己的风险级别配置权限,不会把全局权限开得太大。
Windows 上的全局配置路径通常是:
%USERPROFILE%\.claude\settings.json
全局配置适合放通用习惯,项目级配置适合放某个仓库可以长期信任的命令。
固定项目路径也可以配到全局
如果你有几个长期维护的公司项目,每次打开 Claude Code 都会因为路径权限反复确认,可以在全局 settings.json 里加 additionalDirectories:
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"defaultMode": "acceptEdits",
"additionalDirectories": [
"C:/Users/你的用户名/Documents/Dev/project-a",
"C:/Users/你的用户名/Documents/Dev/project-b",
"D:/work/company-project"
],
"allow": [
"Read",
"Edit",
"PowerShell(git *)",
"PowerShell(npm *)",
"PowerShell(pnpm *)",
"PowerShell(node *)",
"PowerShell(rg *)",
"Bash(git *)",
"Bash(npm *)",
"Bash(pnpm *)",
"Bash(node *)",
"Bash(rg *)"
],
"deny": [
"Read(//**/.env)",
"Read(//**/.env.*)",
"Read(//**/secrets/**)",
"PowerShell(Remove-Item *)",
"PowerShell(git reset --hard*)",
"PowerShell(git push --force*)",
"Bash(rm -rf *)",
"Bash(git reset --hard*)",
"Bash(git push --force*)"
]
}
}
这里有两个细节:
- Windows 路径建议写成
C:/Users/...这种斜杠形式,少踩转义坑。 additionalDirectories解决的是 Claude Code 可以信任哪些额外目录;终端命令仍然要通过PowerShell(...)或Bash(...)单独放行。
如果只想给某个目录更精确的读写权限,也可以写成路径规则。Windows 绝对路径在 Claude Code 权限规则里通常会归一成 POSIX 风格,例如:
"Edit(//c/Users/你的用户名/Documents/Dev/project-a/**)"
不过日常不建议一上来写得太细。固定可信项目用 additionalDirectories,危险动作用 deny 兜底,维护成本更低。
一个适合公司项目的基础配置
可以先在项目里创建 .claude/settings.local.json:
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"defaultMode": "acceptEdits",
"allow": [
"Read",
"Edit",
"Bash(git *)",
"PowerShell(git *)",
"Bash(npm *)",
"PowerShell(npm *)",
"Bash(pnpm *)",
"PowerShell(pnpm *)",
"Bash(yarn *)",
"PowerShell(yarn *)",
"Bash(node *)",
"PowerShell(node *)",
"Bash(rg *)",
"PowerShell(rg *)"
],
"deny": [
"Bash(git push --force*)",
"PowerShell(git push --force*)",
"Bash(git reset --hard*)",
"PowerShell(git reset --hard*)",
"Bash(rm -rf *)",
"PowerShell(Remove-Item *)",
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)"
]
}
}
这里最关键的是:
"defaultMode": "acceptEdits"
它的意思是:对工作目录里的编辑操作更信任,减少“是否允许修改文件”的打扰。但它不是完全裸奔,很多命令和敏感动作仍然会按规则判断。
Windows 上要注意 PowerShell 规则
很多人明明写了:
"Bash(git *)"
但 Claude Code 在 Windows 上仍然问权限,原因可能很简单:它实际走的是 PowerShell,不是 Bash。
所以 Windows 项目里建议把常用命令同时写两份:
"Bash(git *)",
"PowerShell(git *)"
npm、pnpm、node、rg 这些命令也一样。你允许了 Bash,不代表 PowerShell 自动被允许。
不建议直接全局跳过权限
Claude Code 有更激进的模式,例如:
{
"permissions": {
"defaultMode": "bypassPermissions"
}
}
或者启动时使用类似跳过权限检查的参数。这个模式确实安静,但风险也明显变大:误删未提交文件、读取敏感配置、执行危险命令,都可能绕过正常确认。
如果是在临时容器、虚拟机、一次性测试仓库里,可以考虑。公司真实项目、个人主力电脑、包含 .env 或内部代码的仓库,不建议长期这么开。
显式 deny 比 allow 更重要
权限配置里不要只想着“允许什么”,也要明确“永远不允许什么”。比如:
"Bash(git reset --hard*)",
"PowerShell(git reset --hard*)",
"Bash(git push --force*)",
"PowerShell(git push --force*)",
"Read(./.env)",
"Read(./.env.*)"
这些动作即使自己有 Git,也值得单独拦住。Git 能恢复已提交内容,但恢复不了所有未提交草稿、临时文件和本地密钥泄露风险。
复合命令也可能触发多次询问
如果 Claude Code 要执行:
git status && pnpm test
它可能会分别检查 git status 和 pnpm test。只允许其中一个,另一个还是会问。
所以项目里最常用的检查命令,最好直接放进 allowlist,例如:
"Bash(pnpm test*)",
"PowerShell(pnpm test*)",
"Bash(pnpm run *)",
"PowerShell(pnpm run *)"
这样它跑测试、跑 lint、看 Git 状态时会顺很多。
如果公司有托管策略,本地配置可能压不过
公司版 Claude Code 可能会有企业托管策略。遇到“我明明配置了 allow,它还是一直问”的情况,可以先在 Claude Code 里看两件事:
/status
看是否存在企业托管配置。
再看:
/permissions
确认当前到底是哪条规则在生效。
如果企业策略明确要求某些命令必须确认,本地配置就不要和它硬拧,按公司的安全边界来。
我的建议
固定可信项目可以这样分层:
- 全局放温和设置,例如
acceptEdits。 - 对几个长期可信目录,在全局
additionalDirectories里列清楚。 - 每个项目再用
.claude/settings.local.json补充项目自己的常用命令 allowlist。 - 对
.env、secrets、git reset --hard、git push --force这类动作显式 deny。 - Windows 上同时配置
Bash(...)和PowerShell(...)。 - 只有在隔离环境里才考虑
bypassPermissions。
这样配置后,Claude Code 处理小修改、小检查时不会老打断你;真正有风险的动作仍然会被拦下来。对日常开发来说,这个平衡点比“每一步都问”和“什么都不问”都更舒服。




