第一次接触Syncthing的忽略规则时,我完全被那些星号和问号搞晕了。直到有次不小心把node_modules同步到了手机里,才发现这个功能有多重要。简单来说,忽略规则就像是个智能过滤器,告诉Syncthing哪些文件不需要同步。
最基础的忽略规则就是直接写文件名。比如你想忽略所有叫"temp"的文件夹,直接在.stignore文件里写一行"temp"就行。但这里有个坑我踩过:如果你写成"temp/",效果就完全不同了。斜杠结尾表示匹配目录下的内容,但不匹配目录本身。也就是说"temp"会忽略所有叫temp的文件夹,而"temp/"会忽略temp文件夹里的内容,但temp文件夹本身还是会被同步。
通配符是忽略规则的灵魂所在。星号()可以匹配任意数量的字符,但不包括路径分隔符。比如"tep"能匹配"temp"、"teap"、"teeeep",但匹配不了"te/stp"。双星号()就更强大了,它能跨越目录层级匹配。我经常用"/node_modules"来确保不管node_modules藏在项目多深的目录里都能被忽略。
作为开发者,最头疼的就是那些自动生成的目录和文件。我整理了几个开发场景下的实用配置:
对于前端项目,这个配置是我的标配:
code复制node_modules/
dist/
build/
*.log
.DS_Store
.idea/
.vscode/
后端项目我通常会加上:
code复制target/
*.class
*.jar
*.war
*.iml
这里有个实用技巧:可以用{}来组合多个模式。比如想同时忽略多种日志文件可以写成:
code复制*.{log,tmp,bak}
我曾经犯过一个错误,以为".log"就能捕获所有日志文件。结果发现像"access.log.2023-08-01"这样的轮转日志还是被同步了。后来改用".log*"才解决问题。这也让我明白通配符匹配的精确性有多重要。
处理个人文档时,系统生成的隐藏文件和临时文件最烦人。我的.stignore配置是这样的:
code复制.*
~*
*.tmp
Thumbs.db
Desktop.ini
但这里有个特殊情况:你可能想保留某些以点开头的配置文件(比如.gitconfig)。这时候就需要用否定规则:
code复制.*
!.gitconfig
!.ssh/
注意否定规则(!)的位置很重要。规则是按顺序处理的,一旦某个文件被前面的规则匹配了,后面的否定规则就不起作用了。我建议把否定规则放在对应的一般规则之后。
对于照片和视频这类大文件,我习惯用文件大小来过滤:
code复制(?i)*.{jpg,png,mp4,mov}
(?d)(?i)*.{jpg,png,mp4,mov}
第一行忽略所有匹配的文件,第二行的(?d)表示如果这些文件已经存在于同步目录中,可以安全删除。这在清理旧文件时特别有用。
遇到复杂目录结构时,组合使用各种匹配符能发挥奇效。比如要忽略特定目录下的特定文件类型:
code复制docs/**/*.{tmp,log}
!docs/important/**/*.log
这个配置会忽略docs目录及其子目录下所有的tmp和log文件,但保留important子目录下的log文件。
我曾经遇到一个棘手的问题:需要同步Markdown文件,但要忽略特定目录下的Markdown。解决方案是:
code复制*.md
!docs/guides/*.md
记住几个关键原则:
最后分享一个排查技巧:在Syncthing的Web界面,点击"显示忽略文件"可以预览哪些文件会被忽略。这个功能帮我找出了不少配置错误。