SVN 本地全局忽略设置
很多用 SVN 的团队都经历过这种尴尬:svn status 一刷,冒出来几十个不该进版本库的文件——node_modules、__pycache__、.idea、.DS_Store……一不留神就 svn add -A 全提交上去了,仓库体积越滚越大,其他人 checkout 也带下来一堆垃圾。Global ignore pattern(全局忽略规则)就是用来堵住这个口子的:在 SVN 客户端里配置一次,所有工作副本都会自动忽略这些文件。
设置位置
最常见的入口是图形客户端 TortoiseSVN:
Settings → General → Global ignore pattern
在输入框里填入忽略规则,规则之间用空格分隔。TortoiseSVN 安装时默认带了一组规则,但通常不够用,需要自己补。
如果习惯命令行,SVN 的全局忽略写在客户端配置文件里:Linux/macOS 是 ~/.subversion/config,Windows 是 %APPDATA%\Subversion\config。打开文件找到 [miscellany] 段,把 global-ignores 那行注释解开并改成:
global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store obj Obj bin Bin Debug debug *.suo *.tmp *.user *.log *.pdb *.refresh .idea node_modules .git packages TestResults .project .settings
保存后,新建的工作副本立刻生效;已 checkout 的副本重新打开客户端也会读到新配置。
补充一点:TortoiseSVN 读写的是同一个 config 文件,GUI 里改和命令行里改互相生效,只是图形界面更直观,适合不熟悉配置格式的同事。
推荐的全局忽略规则
下面是一套比较常用的全局忽略规则,覆盖了编译产物、系统文件、开发工具生成的文件等:
*.o *.al .libs *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store obj
Obj bin Bin Debug debug *.suo *.tmp *.user *.log *.pdb *.refresh .idea
node_modules .git packages TestResults .project .settings
规则说明
- 编译产物:
*.o、*.a、*.libs、*.so.[0-9]*等为 C/C++ 编译生成的中间文件和库文件; - Python 缓存:
*.pyc、*.pyo为 Python 字节码缓存(Python 3 还会生成__pycache__目录,建议一并加进去); - 编辑器/系统临时文件:
*~、#*#、.#*、*.swp为编辑器产生的临时文件,.DS_Store为 macOS 文件夹元数据文件; - 开发工具目录:
.idea(JetBrains IDE)、.settings(Eclipse)、node_modules(Node.js 依赖)、packages、TestResults(测试结果)等; - 日志与临时文件:
*.log、*.tmp、*.user、*.refresh、*.pdb等。
一个具体例子
假设你在维护一个“Node.js 后端 + Python 脚本 + Java 测试”混用的项目。配置前 svn status 会看到 node_modules/(几万个文件)、__pycache__/、.idea/ 和一坨 *.log;配好上面的规则后,这些全部从列表里消失,只剩你真正改过的源码文件,svn add -A 也敢放心用了。对混合语言项目,global-ignores 这种“一人配置、全机器生效”的方式,比在每个仓库手写 svn:ignore 省事得多。
团队协作的场景更典型:某团队从个人维护转到三人协作,第一次 svn commit 就把 500MB 的 node_modules 提交了上去。用 svn rm --keep-local node_modules 把依赖移出版本库、再补上忽略规则之后,仓库体积立刻回到正常水平,同事的 checkout 时间也从十几分钟降到几秒。Git 项目里这件事靠 .gitignore,SVN 里就是 global-ignores 配合 svn:ignore 一起做。
常见问题
- 规则里的空格怎么处理:
global-ignores用空格分隔各条规则,绝大多数场景不需要匹配空格,遇到特殊字符再加转义。 - 已提交的
node_modules怎么清理:忽略规则不回溯历史,需要先svn rm --keep-local node_modules从版本库移除并提交,之后的文件才会被忽略。 - Windows 上哪些规则没用:平台产物不同,Windows 项目可以换成
*.obj、*.suo、*.pdb、*.dll、*.exe等。 - 规则写错会不会误删文件:忽略规则只作用于未跟踪的文件,写错最多导致漏提交,不会删除或修改已有文件,风险可控。
- 忽略后想临时提交某个文件:
svn add --force 文件可以覆盖全局忽略,只影响这一次,后续依然被忽略。 - 规则会同步给队友吗:
global-ignores是本地生效的,不会自动同步;要统一团队行为,必须配合版本化的svn:ignore属性。 svn status还是显示已忽略文件怎么办:确认规则没写错、文件确实未被跟踪;忽略目录时用不带斜杠的名字(如node_modules),带斜杠会被当作精确路径匹配。- 新仓库怎么默认就配好:TortoiseSVN 支持把全局忽略规则导出到新仓库模板,也可以把一份忽略规则说明放进仓库 README,新人照着配一遍即可。
注意事项
- Global ignore pattern 是本机全局生效的,对所有工作副本都有效;
- 它只影响未加入版本控制的文件,已经
svn add或提交过的文件不会因为该规则被忽略——所以要尽早配置,避免“木已成舟”; - 如果某个被忽略的文件需要提交,可以显式使用
svn add --force强制添加,或临时调整忽略规则; - 不同团队共享的忽略规则,建议通过仓库根目录的
svn:ignore属性(版本化属性)配置,这样所有协作者都能统一生效。命令行设置方式:
svn propset svn:ignore "node_modules
__pycache__
*.log" .
svn commit -m "set svn:ignore"
小结
在 SVN 的 Global ignore pattern 中填入 *.o *.a *.pyc *.pyo *.log node_modules .idea .git 等规则,可以避免编译产物和 IDE 配置被反复误提交,保持版本库干净。更多版本控制与开发工作流内容,可以参考开发工具分类下的Git 工作流与网站开发和Git 部署流程;团队从 SVN 迁往 Git 的场景见CentOS SVN 升级 1.8。
参考:SVN 官方对客户端配置文件的说明见《Runtime Configuration Area》一章 https://svnbook.red-bean.com/en/1.8/svn.advanced.confarea.html。
原文链接:https://www.cnblogs.com/cqzhuomi/articles/17284339.html(博客园 CQZHUOMI,转载)