最近把黑苹果升级到 Big Sur 之后导致 USB 无法识别,在更改配置时又发现电脑中存的几个版本都不对,无奈只能把原配置拷贝出来再进行更改。不过为了吸取之前的教训,准备把配置也放到 GitHub 上,但随之而来的问题是序列号如何处理。
思路
首先想到的是每次在 add 前手动替换序列号,push 完成后再改回去;或是只提交指定范围内的变更,忽略包含序列号的那一行。不过暂不论优劣,两者都依赖手动操作,不可控因素太大。
随后 Google 发现 GitHub 本身是可以实现这个功能的,而且在《Git Pro》也有提到,只能怪当初看的不仔细。
Git 属性
在书中关于 Git 属性那章提到在.gitattributes
文件中可以自定义 Git 某些设置项,其中就包含可以在 add 和 pull 时进行过滤的属性:filter
。
解决
filter 的值可以设置为由clean
和smudge
组成的过滤驱动器;clean 在 add 时触发,smudge 则在 pull 时触发。
设置过滤器
首先在当前项目的.git/info/attributes
目录创建文件.gitattributes
,然后写入:
其中前半句*.plist
表示要过滤的文件后缀名,后半句filter=plist
则为规则名称;意思是对该项目下所有以.plist
后缀结尾的文件应用名为plist
的规则。
配置过滤规则
在命令行中运行:
命令将创建名为plist
的过滤规则,在 add 时将所有hello
替换为world
,然后在 pull 时把所有world
还原为hello
。比如有个文件名为hi.md
内容如下:
当执行git add hi.md
时,再比较会发现内容已变成:
上面的命令也同样会写在当前用户 Home 目录的.gitconfig
文件内:
最后
其实本质上是使用 sed 进行过滤,所以只要是 sed 能实现的功能,都可以在 add 和 push 时进行操作。此外,因为.gitattributes
并未上传,所以在新电脑 clone 时并不会执行。