sftp插件不能直接当rsync用,因其Upload Folder仅为单向覆盖式同步,不删除远程多余文件、无checksum对比、不自动diff,且ignore仅手动配置才生效;remotePath必须以/开头,ignore需正确使用glob模式,超时默认10秒易中断,严格镜像需配合rsync或shell脚本实现。

VSCode 里做远程 FTP 镜像传输,别用 ftp-simple 或 FTP-Sync,它们已停更、中文路径乱码、断连不重试,且不支持真正的“镜像”语义(即删除远程多余文件)。真正能接近 rsync 行为的,只有 sftp 插件配合手动 sftp.json 配置 + 命令触发,但必须清楚它默认不删远端文件、也不自动 diff。
为什么 sftp 插件不能直接当 rsync 用
sftp 插件的 Upload Folder 是单向覆盖式同步:本地有、远程没有 → 上传;本地删了、远程还有 → 不动。它没有内置 checksum 对比或 delete-on-remote 逻辑。所谓“镜像”,实际得靠组合策略实现。
- 插件本身不读取
.gitignore或.sftpignore(除非你手动配ignore字段) -
uploadOnSave只对已打开并显式保存的文件生效,新建文件、未保存修改、批量重命名等场景全漏掉 - 如果远程目录已有旧文件(比如上次上传残留的
dist/old.js),它不会主动清理 - 想删远端多余文件?只能手动右键 →
SFTP: Delete Remote File,或写脚本调用sftpCLI 配合rsync --delete
sftp.json 中 remotePath 和 ignore 的坑
remotePath 必须以 / 开头,否则会被解析为相对用户 home 目录。比如填 "remotePath": "www",实际传到 /home/username/www;填 "remotePath": "/var/www/html" 才是目标位置。
ignore 列表只在 Upload Folder 时生效,且匹配的是本地路径相对工作区的片段。常见错误:
- 写成
"\.git"→ 正确;写成".git"→ 不生效(缺少转义) - 想忽略
node_modules,但没加"/node_modules/**"→ 它会把整个文件夹上传 - Windows 路径写
C:Usersme.sshid_rsa→ 报错;必须用正斜杠:"privateKeyPath": "C:/Users/me/.ssh/id_rsa"
手动触发 Upload Folder 时路径怎么算
右键文件夹 → SFTP: Upload Folder,插件会把该文件夹内所有非 ignore 文件,按「本地相对路径 + remotePath」拼接后上传。例如:
{
"remotePath": "/var/www/site"
}
你在项目根目录右键 src 文件夹上传,src/index.js 会传到 /var/www/site/src/index.js;如果你在 src 目录内右键上传,则 index.js 会传到 /var/www/site/index.js —— 注意这个差异。
- 上传前务必确认当前工作区是项目根目录,否则
remotePath拼接会错位 - 不要依赖右键菜单里的 “Upload File” 处理整个项目:它只传单个文件,不递归
- 上传大文件(>50MB)前建议关掉
debug: true,否则日志刷屏卡死
真要镜像,得补一层 rsync 或 shell 脚本
如果业务要求严格镜像(含删除远端冗余文件),sftp 插件做不到。可行路径只有两个:
- 本地装
rsync,用 SSH 协议推送到远端:rsync -avz --delete -e "ssh -p 22" ./src/ user@host:/var/www/site/ - 在远端开一个最小化 HTTP 接口(如 Python Flask),接收本地打包的 tar.gz,解压覆盖 + 清理旧文件
- 用
sftp插件上传完后,再执行一次ssh user@host 'rm -rf /var/www/site/old_*'这类清理命令(需提前配置免密登录)
最常被忽略的一点:sftp 插件的连接超时默认是 10 秒,上传大文件或高延迟网络下容易中断。必须手动加 "timeout": 60 到 sftp.json,否则上传中途断开也不会报错,只静默失败。


















