Linux 安装 VS Code 这件事,看起来是一条命令的事,但真正在团队里带新人时,我发现十个人里有八个会在同一个地方卡住——要么是装了个版本落后的发行版仓库包,要么是装完不知道code命令为什么敲不出来,要么是环境跑通了但不知道 VS Code 到底把"项目"理解成什么。这篇就围绕"Linux 安装 VS Code、VS Code 使用、创建项目并运行"这条主线,把安装路径的选择逻辑、装完必须改的默认项、工作区的真实模型、以及让代码真正跑起来的任务与调试配置,一节一节讲透。适合刚接触 Linux 桌面的开发者,也适合在 Linux 上做嵌入式、后端、脚本开发的工程师做一次系统梳理。
1. 装之前先想清楚:四类安装包各自的适用边界
1.1 deb、rpm、通用压缩包、沙箱包,本质差在哪
很多人拿到官网下载页,看到deb、rpm、tar.gz三个按钮就开始纠结。其实判断标准只有一个:你希望由谁来管这个软件的升级和依赖。
原生包格式(.deb对应 Debian/Ubuntu 系,.rpm对应 Fedora/RHEL/openSUSE 系)走的是系统包管理器,好处是依赖关系由包管理器负责校验,卸载干净,升级可以跟着系统更新走。通用压缩包(.tar.gz)是把整个程序目录塞进一个文件夹,你解压到哪它就在哪,不写系统级记录,好处是可以在同一台机器上并存多个版本,坏处是升级、卸载、桌面图标、code命令注册全部要自己处理。
沙箱格式(Snap、Flatpak)用只读镜像打包,自带运行时,隔离性强,但访问宿主机文件、调用系统级工具链时经常出现路径和权限上的别扭,对做嵌入式交叉编译、需要调用系统gdb或pkg-config的场景不太友好。
我把这四种方式的差异整理成一张表,选之前对照自己的场景看一眼就够了:
| 方式 | 升级维护 | 依赖处理 | 与系统工具链的配合 | 典型适用场景 |
|---|---|---|---|---|
| 官方源 + 包管理器 | 跟着apt upgrade走,省心 | 自动 | 好 | 主力开发机,长期使用 |
单独安装.deb/.rpm | 需手动重新下载安装 | 基本自动 | 好 | 离线环境、临时机器 |
.tar.gz解压 | 完全手动 | 不处理,靠系统已有库 | 好,但需自己配路径 | 多版本并存、无 root 权限 |
| Snap / Flatpak | 自动 | 由运行时提供 | 一般,常有沙箱摩擦 | 桌面尝鲜、不想动系统 |
1.2 为什么我更推荐走官方软件源,而不是下载单个安装包
单独下载.deb装完那一刻是爽的,但两个月后你就忘了自己是怎么装的。官方软件源的做法是把仓库地址写进系统配置,之后每次apt upgrade都会顺手把编辑器一起升上去,安全更新也不会漏。代价只是第一次配置多敲三四条命令。
反过来,如果你所在的环境不允许访问外部网络,那只能走离线安装包,这时候要养成一个习惯:把安装包文件名连同下载日期一起记录在团队文档里,否则半年后有人问"这台机器上的是什么版本、什么时候装的",谁都答不上来。
还有一类特殊情况:公司内网做了软件源镜像。这种情况下优先用镜像里的版本,别硬装官网最新包,因为镜像版本通常和内部工具链做过兼容性验证,图新鲜反而容易出问题。
1.3 我踩过的第一个坑:仓库里那个"同名不同物"的包
早期在 Debian 系上我图省事,直接apt install code,结果装出来的不是编辑器本体,而是一个看起来名字很像、实际完全无关的包。原因很简单:系统默认仓库里并没有官方编辑器,code这个名字在很多发行版里被别的软件占用了。
判断方法很直接:装完之后执行code --version,如果输出的不是版本号加一段提交哈希,而是别的内容,那基本可以确定装错了。更稳妥的做法是安装前先apt-cache policy code看一眼候选版本和来源仓库,来源里出现官方源域名才说明配对了。
这个坑的教训是:在 Linux 上装任何东西,先确认包来自哪个仓库,再执行安装。多花五秒钟看来源,能省掉半小时排查。
2. 安装全流程:从校验安装包到code命令真正可用
2.1 下载后先做完整性校验,这一步别嫌麻烦
大文件下载过程中被截断、被中间设备改写的情况并不罕见。官方下载页通常会提供校验值,拿到包之后先算一遍:
# 以 deb 包为例,先看官方给出的校验算法是哪种 sha256sum ./code_*.deb # 如果提供的是 gpg 签名,用下面这条验签 gpg --verify ./code_*.deb.sig ./code_*.deb校验通过再装。很多人觉得这是形式主义,但我在实际交付环境里确实遇到过下载不完整导致安装中途报"归档文件损坏"的情况,当时第一反应是怀疑系统依赖有问题,查了半天才发现是包本身不完整。先校验,能把这一类"看着像系统问题、实际是文件问题"的排查成本直接砍掉。
2.2 Debian/Ubuntu 系的命令行安装步骤
走官方源的方式大致是这样几步(不同版本的源地址和密钥获取方式可能略有差异,以官方文档为准):
# 1. 安装基础依赖,用于下载和验签 sudo apt update sudo apt install -y wget gpg apt-transport-https # 2. 导入官方签名密钥(此处示例为通用流程,具体密钥地址以官方为准) # 3. 写入源配置 # 4. 更新索引并安装 sudo apt update sudo apt install -y code # 5. 验证 code --version如果选择直接安装离线包,命令是:
sudo apt install -y ./code_当前版本_amd64.deb注意这里用的是apt install ./文件路径而不是dpkg -i。差别在于apt会在安装过程中自动把缺失的依赖一起补上,而dpkg -i遇到依赖不满足只会报错停下,然后你还得自己apt -f install收尾。新手直接用它,能少掉一整轮"依赖地狱"。
2.3 Fedora/RHEL 系的差异点
RPM 系的思路一样,只是命令换了:
# 离线包 sudo dnf install -y ./code-当前版本.x86_64.rpm # 或者用 rpm 配合自动依赖补齐 sudo rpm -ivh ./code-当前版本.x86_64.rpmRPM 系有一个容易忽略的点:SELinux。在某些默认开启强制模式的环境里,编辑器访问用户主目录之外的文件可能被策略挡住,表现是保存失败或者读取不到文件。遇到这种情况不要急着关 SELinux,先看审计日志确认是不是它拦的,再决定是加策略还是调上下文。
2.4 通用压缩包:解压位置和桌面项要自己安排
没有 root 权限的机器上,.tar.gz是唯一选择。我的习惯是统一放在用户目录下一个固定的位置,比如~/.local/opt/,这样做的好处是同一台机器上可以并存稳定版和预览版,各自有独立的配置目录。
mkdir -p ~/.local/opt && cd ~/.local/opt tar -xzf ~/下载/code-stable-*.tar.gz # 解压后进入 bin 目录确认可执行文件存在 ls -l ~/.local/opt/VSCode-linux-x64/bin/code让code命令全局可用有两种路子:一是把bin目录加进PATH,二是在~/.local/bin下建一个软链接指向真实可执行文件。后者更规整,因为~/.local/bin通常已经在默认PATH里了。
ln -sf ~/.local/opt/VSCode-linux-x64/bin/code ~/.local/bin/code hash -r # 清掉 shell 的命令路径缓存 code --version桌面图标要自己写.desktop文件放到~/.local/share/applications/,其中Exec和Icon都写绝对路径,Icon指向解压目录里resources/app/resources/linux/下的图标文件。写完记得给可执行权限并把文件标记为可信,否则某些桌面环境会弹"不受信任的启动器"。
2.5 验证安装:code --version和code .是两件事
code --version通了只说明命令存在,不代表打开文件夹正常。真正的验证是进入任意一个目录执行code .,看窗口能不能起来、侧边栏能不能列出文件。如果窗口起不来但命令有返回,常见原因是图形环境变量缺失(比如在纯终端里通过su切换了用户)或者沙箱权限问题。
# 查看 code 命令实际指向哪里,排查多版本冲突 which -a code readlink -f "$(which code)"如果which -a出来两三条不同路径,说明系统里存在多个安装,插件目录和配置文件可能互相干扰。这种情况下要明确指定用哪一个,把其他的先清理掉。
3. 首次启动后该动的几处设置:界面、字体、终端、同步
3.1 中文界面:装语言包和理解"部分汉化"
汉化的标准做法是在扩展面板搜索简体中文语言包并安装,然后通过命令面板的"Configure Display Language"切换,重启窗口生效。这里有两个经验点。
第一,语言包只覆盖界面文字,扩展名称、设置项的键名、报错信息仍然是英文。这不是没装成功,而是设计如此。所以别指望"全中文环境",报错信息还是得看英文,长期看反而应该保持对英文术语的熟悉度。
第二,如果切换后部分菜单还是英文,先检查是不是装成了繁体或其他语言包,再看设置文件里"locale"的值是否被同步功能覆盖回去了。我遇到过设置同步把语言设置带回默认值的情况,排查时先看设置文件的实际内容,比在界面上反复点要快。
3.2 把配置写进 settings.json,而不是只点界面
界面上改设置,最终都会落到~/.config/Code/User/settings.json(通用压缩包版会在解压目录下的data/user-data里,这是它便携性的一部分)。直接编辑这个文件的最大好处是:配置变成了可以复制、可以进版本库、可以在多台机器之间搬的东西。
一份起步配置长这样,我按用途分了组:
{ // 编辑器基础行为 "editor.fontSize": 15, "editor.fontFamily": "'JetBrains Mono', 'Sarasa Mono SC', monospace", "editor.tabSize": 4, "editor.insertSpaces": true, "editor.renderWhitespace": "boundary", "editor.minimap.enabled": false, "editor.formatOnSave": false, // 文件与搜索 "files.autoSave": "onFocusChange", "files.exclude": { "**/__pycache__": true, "**/.pytest_cache": true }, "search.exclude": { "**/node_modules": true, "**/.venv": true }, // 保存时按文件类型清理 "files.trimTrailingWhitespace": true, "files.insertFinalNewline": true }说明一下我的取舍:formatOnSave我默认关掉,因为它依赖格式化插件,团队里各人装的插件不一致时,保存一次就产生一堆无关改动,代码评审的时候很难看。等团队统一了格式化工具,再打开才有意义。
files.exclude和search.exclude分开配是有原因的:前者只影响文件树显示,后者影响全局搜索。像node_modules这种目录,我会把它从搜索里排除(否则搜一个变量名要等十几秒),但在文件树里保留,因为偶尔需要进去看某个依赖的源码。
3.3 终端与中文字体:乱码和字宽问题一次解决
Linux 上中文显示出问题,八成是字体和编码两件事。字体方面,装一套等宽中文字体(比如常用的思源黑体等宽变体或类似的等宽字体),然后在设置里让终端和编辑器都用它:
{ "terminal.integrated.fontFamily": "'Sarasa Mono SC', monospace", "terminal.integrated.fontSize": 14, "terminal.integrated.defaultProfile.linux": "bash", "terminal.integrated.cwd": "${workspaceFolder}", "terminal.integrated.scrollback": 10000 }terminal.integrated.cwd设成${workspaceFolder}是个很实用的小改动:默认情况下终端打开的位置有时是用户主目录,跑脚本时相对路径全错;设成工作区根目录后,终端一打开就在项目里,少一步cd。
编码方面,绝大部分现代发行版默认就是 UTF-8,如果出现压缩包解压后文件名乱码,本质是打包端的编码和当前系统编码不一致,中文文件名在非 UTF-8 环境下被打包,解压时就成乱码。处理思路是解压时显式指定来源编码,而不是改系统默认编码。改系统默认编码影响面太大,不值得为了一个压缩包去动。
3.4 设置同步:清楚哪些数据会被带上去
开启设置同步之后,会同步的是设置、快捷键、扩展列表、代码片段、界面状态这类内容。不会同步的是你的项目代码、打开的文件夹历史里的敏感路径、以及终端里的命令历史。这一点要清楚,否则容易在共享机器上产生误解。
我的做法是:个人机器开启同步,公司机器不开,改用一份放在内网仓库里的设置文件手动导入。理由很直接——个人机器上装的扩展里有不少是尝试性的,同步到工作机上会让启动变慢,而工作机需要的是稳定、明确、可审计的一套配置。
4. 把"项目"这个概念落到实处:VS Code 的工作模型
4.1 文件夹就是项目,这是理解一切配置的起点
很多人从别的集成开发环境转过来,习惯先找"新建项目"菜单,结果翻遍菜单也找不到。原因在于 VS Code 的工作模型非常朴素:一个打开的文件夹就是一个项目,不存在独立的项目文件概念(除非你用多根工作区)。所有的搜索、跳转、Git 操作、任务、调试配置,作用域都围绕"当前打开的文件夹"展开。
这个模型带来一个直接后果:.vscode目录的存放位置决定了配置的生效范围。放在项目根目录下的.vscode,只对这个项目生效;放在用户配置目录下的设置,对全局生效。搞混这两者,就会出现"为什么这个项目里能跳转,换个项目就不行"的困惑。
4.2.vscode目录里该放什么、该不该进版本库
一个典型的项目级.vscode目录里会有:
settings.json:项目级设置,比如统一的缩进、指定解释器路径tasks.json:构建任务,把编译命令固化下来launch.json:调试配置extensions.json:推荐扩展列表,新人克隆仓库后编辑器会提示安装
我的判断标准很简单:凡是"换一个人、换一台机器都应该保持一致"的配置,进版本库;凡是"和我的本机路径、我的个人偏好有关"的,进用户设置,不进仓库。
举几个具体例子。launch.json里的miDebuggerPath如果写的是/usr/bin/gdb,这个在绝大多数 Linux 上一致,可以进仓库;如果写的是/home/某个用户名/工具链/gdb,那就绝对不能进,否则别人克隆下来直接报错。这种路径应该用变量代替:
{ "miDebuggerPath": "${command:cpptools.getDebuggerPath}", "cwd": "${workspaceFolder}" }${workspaceFolder}、${fileDirname}、${fileBasenameNoExtension}这几个变量是配置里最常用的,记住它们能省掉大量硬编码路径。${workspaceFolder}是项目根目录,${fileDirname}是当前文件所在目录,${fileBasenameNoExtension}是当前文件名去掉扩展名——最后一个在编译单个文件时特别有用。
4.3 多根工作区:一个窗口管多个仓库的取舍
当一个功能涉及前后端两个仓库,或者一个主项目加一个公共库时,多根工作区就有用了。做法是创建一个.code-workspace文件:
{ "folders": [ { "path": "server" }, { "path": "web-client" }, { "name": "公共库", "path": "../common-lib" } ], "settings": { "editor.tabSize": 2 } }实际用下来,多根工作区的好处是跨仓库搜索和统一配置,坏处是扩展会对所有根目录生效,如果几个仓库的技术栈差异大(比如一个 C++ 一个前端),语言服务会同时加载,内存占用明显上升。我的经验是:同技术栈的多个仓库用多根工作区很舒服,跨技术栈的场景宁开两个窗口。
5. 让代码真正跑起来:任务与调试配置的完整走法
5.1 先明确一件事:编辑器不编译代码
刚上手最容易产生的误解,是以为装了编辑器就能跑任何语言。事实是 VS Code 本身不包含编译器、解释器和调试器,它只是调用你已经装好的工具链,并把输出结果整理成可读的形式。所以"跑不起来"绝大多数时候不是编辑器的问题,而是工具链没装或者没配对。
先在系统里把基础工具装好:
# Debian/Ubuntu 系 sudo apt update sudo apt install -y build-essential gdb # 验证 gcc --version g++ --version gdb --versionbuild-essential这个包是个集合,包含编译器、make、标准库头文件等一堆东西,比单独一个个装省事。装完之后要重启编辑器,因为扩展需要在启动时探测工具链路径。
5.2tasks.json:把编译命令固化成可复用任务
假设项目里有个src目录,主文件是src/main.cpp。手动编译是g++ -g src/main.cpp -o build/main,每次都要敲。写成任务之后就变成一次快捷键:
{ "version": "2.0.0", "tasks": [ { "label": "build-cpp", "type": "shell", "command": "g++", "args": [ "-g", "-std=c++17", "-Wall", "-Wextra", "${file}", "-o", "${fileDirname}/../build/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] }几个字段值得单独说明。-g是生成调试符号,没有它断点根本挂不上,这是新手最常忘的参数。"group"里的isDefault: true让这个任务成为默认构建任务,之后按快捷键就能直接跑,不用每次从列表里挑。problemMatcher指定为编译器的问题匹配器,作用是把编译输出的错误信息解析出来,点击错误直接跳到对应行——这是让任务比手动敲命令强的最关键一点。
label这个名字会在调试配置里被引用,所以取名要短且唯一,别用中文和空格,避免某些场景下的参数解析问题。
5.3launch.json:断点调试的关键字段逐个拆
调试配置的核心是"先构建、再启动调试器、附加上去"这个过程:
{ "version": "0.2.0", "configurations": [ { "name": "调试当前文件(C++)", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/../build/${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build-cpp" } ] }program必须和tasks.json里的输出路径完全一致,这是最常见的配置错误来源。改了一处忘了另一处,表现就是"调试时找不到可执行文件"。我的做法是把输出目录统一成${workspaceFolder}/build,两边都引用同一个相对结构,改的时候一起改。
preLaunchTask的值必须和任务里的label一字不差,否则按调试键时不会先编译,你调试的还是上一次的旧二进制——这个坑非常隐蔽,因为程序能跑,只是结果对不上,容易误以为逻辑写错了。
stopAtEntry设为false表示不在入口停住;排查启动阶段的初始化问题时可以改成true。externalConsole设为false表示输出走集成终端,好处是方便复制,坏处是某些需要真实终端的交互程序可能表现异常。
5.4 Python 走的是另一条路:解释器选择决定一切
Python 没有编译步骤,所以不需要tasks.json,但要处理解释器环境。核心动作只有一个:明确告诉编辑器用哪个解释器。
# 项目里建虚拟环境 python3 -m venv .venv # 激活(Linux 下是 source,注意不是 Windows 的写法) source .venv/bin/activate pip install -r requirements.txt然后在编辑器里通过命令面板选择解释器,指向.venv/bin/python。选好之后,编辑器底部状态栏会显示当前解释器,这个显示很有价值:它是你判断"为什么导入的包提示找不到"的第一线索。九成情况下是解释器选到了系统默认的那个,而包装在了虚拟环境里。
对应的项目级设置可以这样写:
{ "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", "python.terminal.activateEnvironment": true, "python.analysis.extraPaths": ["${workspaceFolder}/src"] }python.terminal.activateEnvironment打开后,集成终端会自动激活虚拟环境,省掉每次手动source。extraPaths用于把非标准的源码目录纳入分析范围,项目结构不是标准布局时特别有用。要注意的是,虚拟环境目录一定加进版本库忽略列表,绝对不要提交。
5.5 运行结果去哪看:三个面板的分工要分清
初学时最迷惑的就是"结果到底在哪"。实际上输出分成三个地方,各有分工:
| 面板 | 显示内容 | 典型用途 |
|---|---|---|
| 终端 | 程序的标准输出、交互输入 | 运行结果、命令行交互 |
| 问题 | 编译器和静态检查报出的错误警告 | 点击跳转到出错行 |
| 输出 | 各扩展自身的日志 | 排查扩展异常、语言服务崩溃 |
如果代码明明有错但"问题"面板是空的,先检查语言服务有没有正常工作(看输出面板里对应扩展的日志),而不是怀疑代码。如果程序跑了但看不到输出,先确认你运行的是不是旧二进制,也就是前面说的preLaunchTask有没有配对。
6. 扩展的选择纪律:按职责装,别按推荐装
6.1 按职责分类,而不是按"热门"装
扩展装多了之后,编辑器启动时间和内存占用会明显上升。我的分类习惯是这样的:
- 语言支持类:C/C++ 官方扩展、Python 官方扩展——这类只装当前项目用得到的
- 格式化与静态检查类:按团队统一标准装,别各装各的
- 版本控制类:Git 相关增强,通常装一个就够
- 效率类:路径补全、括号跳转、待办高亮,挑真正用得上的
- 主题与图标类:随个人喜好,对功能没影响
判断某类扩展值不值得长期留,有个实用办法:连续一周记录自己主动用它的次数。如果一周都没用过一次,直接禁用,别舍不得。
6.2 用配置文件把不同场景隔离开
同一台机器上既做嵌入式 C 又做数据分析,扩展会互相干扰:C 语言服务对 Python 项目做索引纯属浪费。解决方式是使用配置文件功能,一套给 C/C++ 用,一套给 Python 用,按场景切换,切换时扩展集合和设置都跟着变。
配置文件的另一个用途是排查"某个扩展导致编辑器变慢"。创建一套只有基础扩展的干净配置文件,如果卡顿消失,就说明问题在扩展集合里,然后用二分法逐个启用,几次就能锁定。这比漫无目的地卸载重装高效得多。
6.3 把编译环境留在 Linux 侧
如果你日常在别的系统上工作,但目标产物是 Linux 程序(比如嵌入式方向),一个很实用的思路是把代码留在本地,编译和运行放到 Linux 环境里执行,编辑器只作为前端。这样做的好处是工具链、库版本、运行环境和最终部署环境完全一致,能避免"我本机编过了但目标机器跑不了"的问题。
配置这类工作流时,要注意几点:文件同步的方向和范围要明确,别把编译产物目录同步来同步去;Linux 侧的权限和属主要和编译用户一致,否则出现半读半不能写的状态;调试器的路径要指向 Linux 侧的调试器,而不是本机的。
7. 文档里不写但实际会撞上的问题
7.1 文件监视数量不足导致的"修改不生效"
在大仓库里工作一段时间后,可能会遇到改文件保存了但搜索结果不更新、Git 状态不刷新的情况。根因通常是系统对文件监视句柄数量的限制。查看和临时调整:
# 查看当前限制 cat /proc/sys/fs/inotify/max_user_watches # 临时提高(重启失效) sudo sysctl fs.inotify.max_user_watches=524288 # 永久生效:写入配置文件 echo 'fs.inotify.max_user_watches=524288' | sudo tee /etc/sysctl.d/99-inotify.conf sudo sysctl --system这个值不能无限加大,因为它占用的是内核内存,设得过高在大机器上问题不明显,在内存紧张的环境里要谨慎。更根本的解法是把无关目录排除掉——node_modules、构建产物、日志目录这类,本来就不该被监视。
7.2 终端里的复制粘贴、字宽和渲染问题
集成终端偶尔会出现中文字符宽度计算错误,导致光标位置和文字错位。这通常是字体不支持等宽中文导致的,换一套等宽中文字体基本能解决。如果换字体后仍错位,试试调整终端的letterSpacing或改用系统终端作为外部终端。
复制粘贴方面,Linux 下有两套剪贴板机制,选中即复制是一套,快捷键复制是另一套。搞不清楚的时候会出现"明明复制了却粘不出来"。我的做法是统一只用快捷键那条路径,行为最可预期。
7.3code命令失效和启动器图标丢失
前面配好软链接之后,如果某次更新后命令又失效了,先看链接指向的目标还在不在:
ls -l ~/.local/bin/code readlink -f ~/.local/bin/code通用压缩包版本更新后目录名通常带版本号,解压到新目录后旧链接就断了。这时重新建一次链接即可。桌面图标丢失的原因也类似——.desktop里的Exec指向了已经不存在的路径。养成一个习惯:升级通用压缩包版本后,第一时间检查软链接和.desktop文件里的路径。
7.4 卸载和残留清理
走包管理器装的,卸载很简单:
# Debian/Ubuntu 系 sudo apt remove --purge code # RPM 系 sudo dnf remove code需要注意的是,卸载包不会删除用户配置和扩展目录,它们分别在~/.config/Code(或对应发行版的配置目录)和~/.vscode/extensions。如果想彻底重来一次,把这几个目录一起清掉;如果只是想解决配置冲突,保留扩展目录、只重置设置文件通常更快。
我一般会先备份一份配置目录再动手,因为里面存着快捷键和代码片段,那些是自己一点点攒起来的,重建成本比设置本身高得多。
最后分享一个我一直在用的习惯:把个人配置目录里那几个关键文件(设置、快捷键、代码片段)单独复制到一个版本库或者同步盘里,和编辑器自身的同步功能互为备份。踩过两次"同步冲突把本地设置覆盖掉"的坑之后,我就再没只依赖单一备份渠道了。