这里举一个简单的例子:在暂存前,用indent
(缩进)程序过滤所有C源代码。在.gitattributes
文件中设置"indent"过滤器过滤*.c
文件:
*.c filter=indent
然后,通过以下配置,让 Git 知道"indent"过滤器在遇到"smudge"和"clean"时分别该做什么:
$ git config --global filter.indent.clean indent
$ git config --global filter.indent.smudge cat
于是,当你暂存*.c
文件时,indent
程序会被触发,在把它们签出之前,cat
程序会被触发。但cat
程序在这里没什么实际作用。这样的组合,使C源代码在暂存前被indent
程序过滤,非常有效。
另一个例子是类似RCS的$Date$
关键字扩展。为了演示,需要一个小脚本,接受文件名参数,得到项目的最新提交日期,最后把日期写入该文件。下面用Ruby脚本来实现:
#! /usr/bin/env ruby
data = STDIN.read
last_date = git log --pretty=format:"%ad" -1
puts data.gsub(’ D a t e Date Date’, ‘ D a t e : ′ + l a s t d a t e . t o s + ′ Date: ' + last_date.to_s + ' Date:′+lastdate.tos+′’)
该脚本从git log
命令中得到最新提交日期,找到文件中的所有$Date$
字符串,最后把该日期填充到$Date$
字符串中 — 此脚本很简单,你可以选择你喜欢的编程语言来实现。把该脚本命名为expand_date
,放到正确的路径中,之后需要在 Git 中设置一个过滤器(dater
),让它在签出文件时调用expand_d **《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源** ate
,在暂存文件时用Perl清除之:
$ git config filter.dater.smudge expand_date
$ git config filter.dater.clean ‘perl -pe “s/\$Date[^\$]*\$/\$Date\$/”’
这个Perl小程序会删除$Date$
字符串里多余的字符,恢复$Date$
原貌。到目前为止,你的过滤器已经设置完毕,可以开始测试了。打开一个文件,在文件中输入$Date$
关键字,然后设置 Git 属性:
$ echo '# D a t e Date Date’ > date_test.txt
$ echo ‘date*.txt filter=dater’ >> .gitattributes
如果暂存该文件,之后再签出,你会发现关键字被替换了:
$ git add date_test.txt .gitattributes
$ git commit -m “Testing date expan