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 依赖)、packagesTestResults(测试结果)等;
  • 日志与临时文件*.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,新人照着配一遍即可。

注意事项

  1. Global ignore pattern 是本机全局生效的,对所有工作副本都有效;
  2. 它只影响未加入版本控制的文件,已经 svn add 或提交过的文件不会因为该规则被忽略——所以要尽早配置,避免“木已成舟”;
  3. 如果某个被忽略的文件需要提交,可以显式使用 svn add --force 强制添加,或临时调整忽略规则;
  4. 不同团队共享的忽略规则,建议通过仓库根目录的 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,转载)