
把 PyCharm 接到云服务器上这件事我最早是为了省一台高配机器。笔记本只有 16G 内存本地跑个稍微像样的训练脚本就开始疯狂换页风扇声音像起飞。后来索性把算力放到云主机上本地只留编辑器和浏览器。折腾了几轮之后我固定下来一套自己的配置方法用 PyCharm 的远程解释器加部署同步代码本地写、远端跑、断点照样能打。这套方法解决的问题很具体——本地环境不用和远端完全一致重装系统不用重配一大堆依赖换一台电脑只要把 SSH 密钥和项目配置带过去就能继续干活。适合谁适合手里有云主机、需要跑 Python 项目、又不想天天在终端里 vim 的人也适合刚接触远程开发、被“解释器路径”“路径映射”这些词搞得一头雾水的同学。下面我把整套流程按我自己的操作顺序拆开讲包括每一步为什么这么填、哪里容易翻车、翻车了怎么查。1. 先搞清楚 PyCharm 的“远程”到底在远程什么1.1 三种模式选错了后面全是坑很多人一上来就问“怎么连”但 PyCharm 里跟远程沾边的功能其实有三套机制完全不同混着用就会觉得哪哪都不对。第一套是远程解释器SSH Interpreter。代码文件留在本地硬盘PyCharm 通过 SFTP 把改动同步到远端目录运行时让远端的 Python 解释器去执行调试时本地 IDE 和远端调试进程之间再拉一条隧道。你在编辑器里看到的还是本地文件索引、搜索、跳转都在本地完成速度取决于你自己的机器。第二套是远程开发Remote Development / Gateway。代码本身放在远端本地只跑一个瘦客户端界面渲染、索引、补全全部在远端完成。这种模式对本地机器几乎没有要求但要求远端有足够的内存和 CPU 来跑 IDE 后端一般建议远端至少 4 核 8G否则索引一个大项目能卡到怀疑人生。第三套是纯部署同步Deployment。只配 SFTP 上传下载不绑解释器。代码传上去之后你需要自己开终端敲命令运行。它不算真正的远程开发但在“只想把文件推上去”的场景里最轻量。模式代码位置索引在哪本地资源占用适合场景SSH 远程解释器本地本地中本地性能够用只是算力不够Gateway 远程开发远端远端低本地是轻薄本项目较大纯 Deployment 同步本地本地低只做文件搬运运行靠终端1.2 我为什么常年用“SSH 解释器 部署同步”这套组合选它不是因为先进而是因为省心。我的日常是改几行代码、跑一下、看日志、再改节奏很快。远程解释器模式下文件在本地Git 操作、全文搜索、历史对比全是本地速度改完按一下保存就自动传上去然后点运行输出直接回显在 Run 窗口里。断点调试也能用虽然第一次连接会慢几秒但之后体验跟本地跑没太大差别。Gateway 模式我也用过一段时间好处是代码不落地换设备无缝衔接。但它有两个现实问题一是远端机器得长期开着关机就断二是远端 IDE 后端要吃内存我那种 2 核 4G 的入门配置根本扛不住索引跑一半就被系统杀掉。所以我把它定位成“临时用别人的机器”或者“项目特别大、本地实在带不动”时的备选。还有一个容易被忽略的点远程解释器模式下本地项目的.idea目录里会记下部署配置和解释器配置把整个项目目录打包换台电脑配置基本能原样恢复。这个特性对我这种经常换设备的人非常友好等于把“环境”变成了项目的一部分。2. 云主机侧门开对、用户建好、环境备齐2.1 安全组只放自己的 IP系统防火墙再兜一层连不上服务器十次里有六次是网络层的问题而且大多不是服务器坏了是入口没开。云服务器通常有两层门一层是控制台里的安全组规则一层是系统内部的防火墙。两层都得放行少一层就是超时。安全组的入方向规则我一般只加一条端口 22协议 TCP来源填自己当前网络的出口 IP写成x.x.x.x/32。千万别图省事写0.0.0.0/0公网上的扫描流量比你想象的多得多日志里一天几千条尝试登录是常态。出口 IP 会变家里宽带重启、换个咖啡馆就连不上这时候去控制台改一下来源就行两分钟的事。系统防火墙这边不同发行版命令不一样。Ubuntu 系常用 ufwsudo ufw allow from 203.0.113.10 to any port 22 proto tcp sudo ufw enable sudo ufw status verboseCentOS 系常用 firewalldsudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address203.0.113.10/32 port port22 protocoltcp accept sudo firewall-cmd --reload sudo firewall-cmd --list-all注意先把规则加进去再启用防火墙。顺序反了你自己也被挡在外面只能去控制台走 VNC 救援。判断到底是哪一层没通最直接的办法是在本地用nc -vz 主机IP 22或者telnet 主机IP 22。如果卡住直到超时基本是安全组或防火墙丢包如果立刻返回 refused说明包到了机器但服务没监听问题在 sshd。2.2 建普通用户、灌公钥、收紧 sshd直接用 root 登录是省事但我不建议。日常开发用普通账号需要提权时再 sudo出问题的影响面小很多而且很多工具对 root 家目录的权限处理很别扭。建用户和配密钥的完整流程大概是这样sudo adduser devuser sudo usermod -aG sudo devuser sudo mkdir -p /home/devuser/.ssh sudo chmod 700 /home/devuser/.ssh sudo cp /tmp/my_key.pub /home/devuser/.ssh/authorized_keys sudo chown -R devuser:devuser /home/devuser/.ssh sudo chmod 600 /home/devuser/.ssh/authorized_keys这里有个特别隐蔽的坑家目录权限。如果/home/devuser对 group 或 other 有写权限sshd 的 StrictModes 检查会直接拒绝公钥登录日志里写的是Authentication refused: bad ownership or modes for directory。所以还要确认sudo chmod 750 /home/devuser ls -ld /home/devuser /home/devuser/.ssh /home/devuser/.ssh/authorized_keys正常应该是drwxr-x---、drwx------、-rw-------这样的形态。接着改 sshd 配置文件通常在/etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes AllowUsers devuser MaxAuthTries 3 ClientAliveInterval 60 ClientAliveCountMax 3改完别急着重启先做语法检查sudo sshd -t没有输出说明配置合法再 reloadsudo systemctl reload ssh服务名在 Ubuntu 上是ssh在 CentOS 上是sshd拿不准就用systemctl list-units | grep -i ssh看一眼。用 reload 而不是 restart是为了避免把当前这条连接一起断掉。2.3 Python 环境与目录规划给后面省事远程解释器最终要指向一个具体的 Python 可执行文件所以远端必须先有环境。我习惯用 venv一个项目一个路径和项目名对齐找起来不费脑子。sudo apt update sudo apt install -y python3.11 python3.11-venv python3-pip python3.11 -m venv /home/devuser/venvs/proj-a source /home/devuser/venvs/proj-a/bin/activate pip install -U pip目录我一般这么分/home/devuser/ ├── projects/ │ ├── proj-a/ │ └── proj-b/ ├── venvs/ │ ├── proj-a/ │ └── proj-b/ ├── data/ └── logs/projects放代码venvs放环境data放数据集和模型权重logs放运行输出。这样分的好处是PyCharm 同步时只同步projectsdata和logs不进同步范围避免每次保存都触发几个 G 的文件比对。磁盘空间要提前算一下。一个干净的 venv 大概 300MB 到 1GB取决于装了多少包PyCharm 的远端辅助文件放在~/.pycharm_helpers首次连接会自动上传大概占用 100MB 到 300MB再留出数据集和日志的空间。系统盘如果只有 40G装两三个环境再放点数据就紧张了建议至少留 10G 余量。内存方面如果机器只有 2G跑稍大的脚本容易被 OOM Killer 干掉。加一块交换分区能缓解代价是慢sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab3. 本地侧PyCharm 与 SSH 的琐碎准备3.1 版本与授权社区版做不了远程解释器这是第一个劝退点远程解释器是专业版功能社区版没有。如果你在社区版的设置里找不到 “SSH” 相关的解释器选项不是你操作错了是版本不支持。替代方案有两个用 Gateway 的免费额度有条件限制或者退回“部署同步 内置终端”的组合也就是本地写完自动传上去然后在 PyCharm 底部的 Terminal 里 SSH 登录执行。专业版的版本号我也建议保持较新2022 年之后的版本在 SSH 解释器配置界面上改动比较大网上一些老教程的截图对不上。菜单大致路径是Settings / Preferences→Project: 项目名→Python Interpreter→ 右侧齿轮或Add Interpreter→On SSH。如果你的界面里是 “SSH Interpreter” 而不是 “On SSH”说明版本偏老流程大同小异。3.2 写一份 ssh config别再手敲 IPPyCharm 的 SSH 配置界面支持直接读~/.ssh/config里的 Host 别名这是个很实用的功能。把主机信息写进 config之后不管是命令行还是 IDE都只用记一个短名字。Host cloud-dev HostName 203.0.113.10 Port 22 User devuser IdentityFile ~/.ssh/id_ed25519_cloud IdentitiesOnly yes ServerAliveInterval 30 ServerAliveCountMax 6 TCPKeepAlive yes几个参数值得解释一下。IdentitiesOnly yes是告诉 SSH 只用指定的这把钥匙不要挨个试 ssh-agent 里的其他密钥。机器上密钥一多不加这行经常出现“明明配了正确的 key 却认证失败”的情况因为 SSH 在尝试次数用尽之前没轮到正确的那把。ServerAliveInterval 30配合ServerAliveCountMax 6意思是每 30 秒发一次保活探测连续 6 次没回应才判定断开也就是容忍 180 秒的网络静默。这个值对家用宽带和移动网络比较友好太小容易误判断线太大又会让真正掉线后卡很久才提示。我试过 15 秒和 60 秒最后还是 30 秒这档最平衡。HostName填公网 IP 还是内网 IP取决于你的网络位置。如果本地和云主机在同一个私有网络里比如通过专线或对等连接打通走内网地址延迟更低、也不消耗公网流量否则只能填公网地址。3.3 密钥权限、known_hosts 与首次连接密钥生成用 ed25519 就够了比 RSA 短握手也快ssh-keygen -t ed25519 -C pycharm-cloud -f ~/.ssh/id_ed25519_cloud生成时会给私钥加口令这个口令在 PyCharm 第一次连接时会问你要可以选择记住。加了口令的私钥即使被拷走没有口令也用不了安全性高不少。如果嫌每次麻烦也可以不设口令但那就等于把钥匙明文放在磁盘上自己权衡。私钥权限必须是 600公钥 644。Windows 上不是 chmod 那一套需要用文件属性把继承权限去掉只保留当前用户。PyCharm 在 Windows 上读到权限过宽的私钥有时会直接报错有时会静默失败很难查。首次连接会提示服务器指纹确认后写入~/.ssh/known_hosts。如果之后重装了系统或者换了主机指纹变了就会报REMOTE HOST IDENTIFICATION HAS CHANGED。处理办法是把这个旧记录删掉ssh-keygen -R 203.0.113.10然后再连一次重新确认。这个报错看着吓人其实就是本地记的指纹和远端对不上清掉重来即可。先用命令行验证一遍能登录再去 PyCharm 里配。这一步很重要——命令行能过说明网络、认证、权限都没问题后面出问题就只可能是 IDE 配置命令行都过不了在 IDE 里试半天纯属浪费时间。4. 配置实操从添加解释器到跑通第一行代码4.1 添加 SSH 解释器每一步填什么打开Settings→Project→Python Interpreter→Add Interpreter→On SSH。第一屏填连接信息如果前面写了 ssh config可以直接在下拉里选cloud-dev字段会自动带出来。手填的话就是主机地址、端口、用户名。点下一步选认证方式。有密码和密钥两种我固定用密钥选Key pair私钥路径指向~/.ssh/id_ed25519_cloud口令填上。这里有个细节PyCharm 会把连接信息存进项目配置私钥路径是绝对路径。换电脑或者换用户名之后这个路径失效需要重新指定。再下一步是解释器路径和同步目录。解释器路径这一栏如果远端用的是 venv就填/home/devuser/venvs/proj-a/bin/python如果用的是系统 Python填/usr/bin/python3。填完之后 PyCharm 会去远端探测这个文件是否存在、版本是多少探测成功会在下方显示 Python 版本号。看不到版本号就说明路径错了别硬往下走。同步目录Sync folders决定本地哪个目录对应远端哪个目录。左边填本地项目根目录右边填远端项目目录比如/home/devuser/projects/proj-a。这个映射关系是后面所有同步行为的基础。4.2 路径映射最容易翻车的一步我见过最多的报错就是“解释器配好了运行却提示找不到文件”。根因几乎都是路径映射没对齐。PyCharm 判断一个本地文件在远端对应哪个路径靠的是部署配置里的 Mappings。如果本地项目根是/Users/me/work/proj-a映射到远端/home/devuser/projects/proj-a那么本地src/main.py对应的远端路径就是/home/devuser/projects/proj-a/src/main.py。运行的时候PyCharm 会把这个远端路径作为脚本路径传给解释器。问题出在两种情况。第一种是添加解释器时填的同步目录和部署配置里的映射不一致。比如解释器那里填了/home/devuser/projects/proj-a部署配置里却写成/home/devuser/proj-a两边打架运行时就在一个空目录里找文件。第二种是项目根目录本身选错了比如打开的是项目的父目录映射却按子目录写路径整体偏移一层。排查方法很土但有效在 PyCharm 里随便选一个文件右键Deployment→Copy Path→Remote Path看看出来的路径是不是你预期的。如果不一致去Tools→Deployment→Configuration→Mappings里改改完记得点Apply。还有一个隐形坑远端目录必须存在且当前用户有写权限。PyCharm 同步时如果目标目录不存在有的版本会自动创建有的版本直接失败。稳妥起见先在远端mkdir -p建好chown给自己的账号。4.3 部署配置同步什么、不同步什么部署配置在Tools→Deployment→Configuration。类型选 SFTPSSH 配置选前面那个cloud-dev。Mappings按上一节对齐。真正决定体验的是几个开关在Tools→Deployment→Options里。Upload changed files automatically to the default server有三个选项Always、On explicit save action、Never。我选的是On explicit save action也就是按 CtrlS 才传而不是每敲一个字就传一次。Always在网络好的时候很顺滑但网络一抖编辑器就会频繁卡在“上传中”输入都变迟钝。Delete remote files when local are deleted我建议打开否则本地删掉的文件会一直留在远端时间长了目录越来越乱。但要注意打开这个开关之后本地误删也会同步删远端操作前想清楚。Preserve files timestamps建议打开避免每次同步都刷新修改时间影响一些依赖 mtime 的增量构建工具。排除清单是重头戏。Excluded Paths里可以按本地路径和远端路径分别加。我固定排除这些.git __pycache__ *.pyc .venv venv .idea data logs *.ipynb_checkpoints node_modules *.ckpt *.pt *.pth *.zip *.tar.gz理由很简单.git目录动辄几百 MB同步它纯属浪费带宽__pycache__和.pyc是远端自己生成的传上去反而可能因为版本不一致导致诡异的导入错误data和模型权重是大文件几十 MB 起步走 SFTP 会卡住整个同步队列.idea是 IDE 自己的配置来回同步容易产生冲突。排除之后还有一个动作要做在项目视图里把data、logs这类目录右键Mark Directory as→Excluded。这告诉 PyCharm 不要索引它们。大目录进了索引本地内存会明显上涨搜索也会变慢。4.4 验证跑通、断点、看日志配置完成后先做个最小验证。在远端目录里建一个hello.pyimport sys import platform print(python:, sys.version) print(platform:, platform.platform()) print(executable:, sys.executable)在本地同样的路径建一份内容一致保存等同步完成右下角会有上传提示。然后右键运行。如果输出里的executable是远端 venv 里的路径说明解释器绑对了如果显示的是本地路径说明根本没走远程。接着验证断点。在print那行打个断点用调试模式启动。第一次会慢一些因为 PyCharm 要往远端传调试组件。断点命中后变量面板、调用栈都能正常看。如果断点不停先确认代码路径映射是否一致——调试器是按文件路径匹配断点的本地路径和远端路径对不上断点就是摆设。最后看一眼~/.pycharm_helpers的占用du -sh ~/.pycharm_helpers这个目录会随 PyCharm 版本变化累积多个版本偶尔清理一下旧的能省不少空间。但别整个删掉下次连接会重新上传慢。5. 进阶代码放远端、端口转发与多环境5.1 Gateway 模式代码不落地如果本地机器实在弱或者你需要在多台设备之间切换Gateway 模式值得一试。入口在 PyCharm 欢迎界面的Remote Development→SSH填主机信息连上之后选择在远端安装 IDE 后端。之后本地只是一个客户端窗口代码、索引、运行全在远端。它对远端的要求至少 4 核 8G 比较舒服磁盘留 10G 以上给 IDE 后端和索引缓存。我试过 2 核 4G打开一个中等规模的 Python 项目索引阶段直接把内存吃满系统开始杀进程体验很差。Gateway 模式的一个实际好处是断点调试的路径问题消失了因为代码本来就在远端不存在映射。另一个好处是终端、运行、调试都在同一个环境里不会出现“本地终端和远端解释器环境不一致”的困惑。代价是网络抖动时整个界面都会卡因为它本质上是远程桌面式的交互。5.2 端口转发本地浏览器访问远端服务跑 Web 服务、Jupyter、TensorBoard 这类东西服务监听在远端的127.0.0.1:8888本地浏览器直接访问公网 IP 是打不开的因为绑的是回环地址而且安全组也不该为这种临时服务开端口。正确做法是端口转发。PyCharm 的 SSH 配置界面里有Local port forward的输入框格式是本地端口:目标地址:目标端口比如8888:localhost:8888。配好之后本地浏览器访问http://localhost:8888就等于访问远端的 8888。如果不想依赖 IDE命令行更直接ssh -N -L 8888:localhost:8888 cloud-dev-N表示不执行远程命令只做转发这个窗口开着别关。想看多个服务就加多条-L。端口转发有个常见误区以为转发之后远端服务要绑0.0.0.0才能访问。其实不用绑127.0.0.1反而更安全因为流量是从 SSH 隧道进来的在远端看来就是本地回环访问。绑0.0.0.0还会把端口暴露到公网多一层风险。5.3 多项目多解释器怎么管手上同时有两三个项目是常态每个项目依赖不同Python 版本也可能不同。我的做法是一个项目一个 venv命名跟项目目录一致然后在 PyCharm 里给每个项目单独绑定解释器。PyCharm 会把已配置的解释器缓存下来切换项目时在右下角点一下就能换不用重新填一遍连接信息。切换时要注意同步目录也会跟着变。如果两个项目的远端目录是平级的比如/home/devuser/projects/a和/home/devuser/projects/b一般不会互相干扰。但如果一个项目的映射写成了父目录/home/devuser/projects另一个写成子目录就可能出现文件传到错误位置的情况。我的习惯是每个项目的映射都精确到项目自己的目录绝不用父目录兜底。依赖管理上我倾向在远端装包而不是本地装完再同步。原因很实际有些包带编译产物本地是 macOS 的.so传到 Linux 上根本加载不了。在远端用pip install装装完pip freeze requirements.txt本地只保留这个文本文件用于版本管理干净利落。6. 常见问题速查连不上、认证失败、同步异常6.1 连不上按三层往下剥排查连接问题我固定按三层走网络通不通、认证过不过、应用层对不对。顺序不能乱跳着查会把自己绕晕。网络层本地nc -vz 主机 22。超时就是包被丢查安全组、系统防火墙、路由。返回 refused 说明包到了但服务没监听查 sshd 状态systemctl status ssh。返回 succeeded 说明网络和端口都没问题进入下一层。认证层ssh -v cloud-dev看详细握手过程。重点看它有没有把正确的私钥拿出来试以及服务端返回的失败原因。Permission denied (publickey)是最常见的原因无非几种用户名写错、公钥没进authorized_keys、权限过宽、私钥格式不被支持。应用层能登录但 PyCharm 报错就看具体报什么。解释器找不到查路径同步失败查目录权限和磁盘空间卡在 “Uploading helpers” 查网络质量和~/.pycharm_helpers的写权限。6.2 认证失败九成是权限和密钥格式公钥认证失败的排查我整理了一张表基本覆盖了我遇到过的所有情况。现象大概率原因处理办法Permission denied (publickey)公钥没写进目标用户的 authorized_keys检查/home/用户/.ssh/authorized_keys内容同样的报错但公钥确实在家目录或 .ssh 权限过宽chmod 750家目录700.ssh600密钥文件日志提示 bad ownership文件属主不是登录用户chown -R 用户:用户 /home/用户/.ssh提示密钥格式不支持用了 PuTTY 的 .ppk 格式转成 OpenSSH 格式再试一直提示输入密码PasswordAuthentication no但客户端在试密码确认用的是密钥认证config 里加IdentitiesOnly yes偶尔能连偶尔不能多把密钥轮询次数耗尽指定IdentityFile关掉 ssh-agent 里的干扰项还有一个容易被忽略的AllowUsers写了之后只允许列出的用户登录。如果你新建了用户却忘了加进去表现就是密码正确也登不上日志里也没有明显提示。改 sshd 配置的时候把这一行一起检查。6.3 解释器与同步的坑解释器相关的问题表现都很像但原因不同提示解释器路径无效路径写错或者 venv 被删了。去远端ls -l 路径确认文件存在且可执行。能运行但用的不是远端环境检查输出里的sys.executable。如果指向本地说明解释器压根没绑上可能选了“系统解释器”而不是 SSH 解释器。断点不停路径映射不一致或者代码有多进程、子进程。多进程调试需要额外配置不是所有场景都能自动跟进。导入报错但本地正常远端没装对应的包或者装在了另一个 venv 里。在 PyCharm 的终端里which python和pip list对一下。同步相关的问题保存后远端没变化自动上传没开或者当前文件所在目录被排除了。传上去了但位置不对映射写错用右键Remote Path验证。上传卡住不动大文件、网络抖动、远端磁盘满。先df -h看磁盘再单独传小文件测试。本地删了远端还在删除同步没开。中文文件名乱码两端编码不一致统一用 UTF-8。6.4 稳定性与性能长时间挂着远程连接最常见的问题是“放一晚上回来发现断开了”。这多半是网络中间设备清理了空闲连接。前面 ssh config 里的保活参数就是干这个的ServerAliveInterval加上之后基本不会再莫名其妙断。同步速度慢除了网络本身还有两个可调的点。一是排除清单要彻底尤其是__pycache__和数据集目录漏一个就能让每次保存都卡几秒。二是避免在项目根目录放超大文件PyCharm 的同步是按文件粒度的一个大文件会阻塞队列里后面的小文件。Windows 本地还有一个换行符的坑。本地是 CRLF传到 Linux 上如果脚本带 shebang执行时会报bad interpreter: /bin/bash^M。解决办法是在 PyCharm 里把行分隔符设为 LF右下角状态栏可以改或者在项目里加.gitattributes统一。这个坑我在部署脚本上踩过好几次每次都以为是权限问题其实是多了个不可见字符。7. 几个自用脚本和约定7.1 一键体检脚本每次换机器或者连不上我都会先跑一遍这个小脚本把常见问题一次性排掉#!/usr/bin/env bash HOST${1:?用法: ./check.sh 主机地址} PORT${2:-22} echo 1. 端口连通性 nc -vz -w 5 $HOST $PORT || echo 端口不通查安全组和防火墙 echo 2. SSH 握手 ssh -o BatchModeyes -o ConnectTimeout5 devuser$HOST echo ok \ || echo 认证失败检查密钥和权限 echo 3. 远端关键信息 ssh devuser$HOST echo 用户: $(whoami); echo Python: $(python3 --version 21); df -h /home | tail -1它不能解决所有问题但能把“网络、认证、环境”三段快速切开省掉很多盲猜。7.2 大数据集不走 PyCharm这条是我踩坑之后定下的死规矩超过 50MB 的文件不走 IDE 同步。原因很直接SFTP 同步是串行的一个大文件传十分钟期间你保存的所有代码都排在后面编辑器看起来像卡死了。大文件我用两种方式。临时的一次性传输用rsync带压缩和断点续传rsync -avz --progress ./data/ devuser203.0.113.10:/home/devuser/data/-z开压缩文本类文件收益明显已经压缩过的二进制文件收益不大但也不亏。数据量大且需要长期存放的直接传到对象存储远端用命令行拉取比走 SSH 稳定得多也不占主机带宽。7.3 我的目录与命名约定最后说几个看起来无关紧要、实际很省事的约定。项目目录名和 venv 目录名保持一致比如项目叫proj-a环境就叫/home/devuser/venvs/proj-a。这样在任何地方看到路径都能立刻知道它属于哪个项目删环境的时候也不会误删别的。远端项目目录下永远有一个logs子目录运行脚本时把输出重定向进去文件名带日期。远程调试的时候Run 窗口的输出会丢日志文件是唯一的事后依据。.idea目录我会保留在项目里但不进 Git。它记录了部署配置和解释器配置换电脑时把整个项目拷过去配置能恢复大半只需要改一下私钥路径。如果团队里多人协作把deployment.xml拿出来共享能省掉每个人重新配一遍的麻烦。还有个小习惯每次改完 sshd 或者防火墙配置先在另一个终端保持一条已经登录的连接不关再去改。改坏了还有救不至于把自己锁在门外去控制台开救援模式。这个习惯帮我省过至少两次重装系统的时间。