最近把黑苹果升级到 Big Sur 之后导致 USB 无法识别,在更改配置时又发现电脑中存的几个版本都不对,无奈只能把原配置拷贝出来再进行更改。不过为了吸取之前的教训,准备把配置也放到 GitHub 上,但随之而来的问题是序列号如何处理。

思路

首先想到的是每次在 add 前手动替换序列号,push 完成后再改回去;或是只提交指定范围内的变更,忽略包含序列号的那一行。不过暂不论优劣,两者都依赖手动操作,不可控因素太大。

随后 Google 发现 GitHub 本身是可以实现这个功能的,而且在《Git Pro》也有提到,只能怪当初看的不仔细。

Git 属性

在书中关于 Git 属性那章提到在.gitattributes文件中可以自定义 Git 某些设置项,其中就包含可以在 add 和 pull 时进行过滤的属性:filter

解决

filter 的值可以设置为由cleansmudge组成的过滤驱动器;clean 在 add 时触发,smudge 则在 pull 时触发。

设置过滤器

首先在当前项目的.git/info/attributes目录创建文件.gitattributes,然后写入:

*.plist filter=plist

其中前半句*.plist表示要过滤的文件后缀名,后半句filter=plist则为规则名称;意思是对该项目下所有以.plist后缀结尾的文件应用名为plist的规则。

配置过滤规则

在命令行中运行:

git config --global filter.plist.clean 'sed "s/hello/world/g"'
git config --global filter.plist.smudge 'sed "s/world/hello/g"'

命令将创建名为plist的过滤规则,在 add 时将所有hello替换为world,然后在 pull 时把所有world还原为hello。比如有个文件名为hi.md内容如下:

hello

当执行git add hi.md时,再比较会发现内容已变成:

world

上面的命令也同样会写在当前用户 Home 目录的.gitconfig文件内:

[filter "plist"]
     clean = sed \"s/hello/world/g\"
     smudge = sed \"s/world/hello/g\"

最后

其实本质上是使用 sed 进行过滤,所以只要是 sed 能实现的功能,都可以在 add 和 push 时进行操作。此外,因为.gitattributes并未上传,所以在新电脑 clone 时并不会执行。

参考