最近遇到这样的需求:我需要把某两次提交之间的代码变化diff出来,给另外一位童鞋去apply,但是diff的时候我又想忽略其中某几个文件(比如:自动化生成出来的类似build.js,dist.js之类的文件)。于是鼓捣了一番,找到了如下解决办法:
- 设置git-diff 自定义driver
- 在gitattributes中设置要忽略的路径和规则,使得对build.css和build.js做git-diff的时候有直接掉过的效果
设置git-diff driver
git支持自定义diff驱动器(见其中diff.driver.command的说明),意思是说git-diff的时候可以指定一个命令去跑,而不是跑内置的。有了这个配置支持,我们就可以设置如下nodiff的指令(在项目根路径):
git config diff.nodiff.command /usr/bin/true
这个指令干嘛呢?这个指令什么都不干,直接返回true(/usr/bin/true),这样就有了类似跳过的效果。
设置git attributes
关于git attributes可以直接看官方文档说明 ,我们利用这个特性在项目根目录中,创建一个.gitattributes文件,并添加如下配置:
build.css diff=nodiff
build.js diff=nodiff
好了现在我们就可以连起来理解了,当我们运行git diff命令的时候,git就会读取.gitattributes的配置,然后发现遇到build.css和build.js文件的时候,需要执行nodiff指令,而nodiff指令被我们此前配置成了/usr/bin/true直接返回true,于是,就直接“跳过”了。
这里文件路径的配置和.gitignore是一样的,支持目录,文件,通配符之类的,可以轻松实现忽略一批文件或者整个目录。