vscode无原生项目目录同步功能,实际分三类场景:settings sync复现插件环境(仅同步id非文件)、sftp实现本地→远程单向同步(需配置uploadonsave与ignore)、dev containers支持主机↔容器双向挂载(依赖docker bind mount)。

VSCode 本身不提供“项目目录同步”功能,所谓“同步”实际指向三种不同场景:跨设备复现插件环境、本地与远程服务器文件同步、本地与容器内文件双向挂载。选错方案会导致反复重装插件、文件覆盖丢失或 SSH 连接失败。
用 Settings Sync 同步插件列表到新电脑
这是最常被误当成“目录同步”的操作——其实同步的是 extensions 列表,不是文件夹结构。VSCode 内置的 Settings Sync 基于 GitHub Gist 加密存储,只记录插件 ID 和版本约束,不传输插件本体。
- 启用前必须彻底退出 VSCode(包括后台
code.exe或Code Helper进程),否则部分扩展状态可能未写入 - 勾选
Extensions时,VSCode 仅安装 marketplace 上可公开获取的插件;若用了私有插件(如公司内网发布的myorg.custom-linter),需手动复制~/.vscode/extensions/下对应文件夹 - 同步后插件不会立即启用:部分插件(如
esbenp.prettier-vscode)依赖工作区配置触发,需打开含.prettierrc的项目才能激活
用 SFTP 插件同步本地与远程服务器目录
真正做“目录级文件同步”的是 SFTP 扩展,它基于 SSH 协议监听保存事件,把本地修改推到远端路径。但默认不支持反向同步(服务器改了不会自动拉回)。
-
uploadOnSave设为true才生效,且仅对当前工作区根目录下文件有效;子目录里新建的.env文件若不在ignore列表中,会触发上传,但若远端已存在同名文件且权限为只读,上传会静默失败 -
ignore字段用 glob 模式匹配,"**/.git/**"能忽略所有子目录下的 .git,但"node_modules"写成"node_modules/"就会失效——末尾斜杠不是必须的,但通配符位置必须准确 - 私钥登录时,
privateKeyPath必须是绝对路径(如"/Users/me/.ssh/id_rsa"),Windows 上用"C:\Users\me\.ssh\id_rsa",用~会解析失败
用 Dev Containers 实现本地与容器目录双向挂载
这是唯一真正“实时双向同步目录”的方案,底层依赖 Docker 的 bind mount,修改任意一端文件,另一端立刻可见,无需插件干预。
-
mounts中的source必须是主机上的绝对路径或 VSCode 变量(如"${localWorkspaceFolder}"),不能写相对路径"./src",否则容器启动失败 - 挂载点
target路径在容器内必须已存在,若镜像里没有/workspaces/my-project目录,需在postCreateCommand里先mkdir -p /workspaces/my-project - Windows 主机挂载到 Linux 容器时,换行符和文件权限可能不一致;若项目含 shell 脚本,需在
.gitattributes中设置*.sh text eol=lf避免 CRLF 错误
真正要同步“项目目录结构”,得看目标:复现开发环境就用 Settings Sync;同步生产代码就用 SFTP;调试运行时就用 Dev Containers。三者配置文件(settings.json、sftp.json、devcontainer.json)都放在 .vscode/ 下,但作用域完全不同,混用会导致预期外的行为。











