文章参考自:https://git-scm.com/book/zh/v2/自定义-Git-Git-属性#rfilters_b
自定义Git – Git属性
基于路径的设置项被称为Git属性:
注: 1,针对特定的路径配置某些设置项,Git就只针对特定的子目录或者子文件集运用它们。
2,Git目录下.gitattributes文件进行设置
3,设置属性文件不提交,在.git/info/attiributes文件中进行设置
属性功能:
1,对项目中的文件或目录定义不同的合并策略
2,让Git 知道怎么比较非文本文件
3,让Git在提交或检出前过滤内容
二进制文件:
使用属性的目标:让Git知道哪些是二进制文件,并指示如何处理这些文件
识别二进制文件:
1,有些文件表面上是文本文件,实质上应被作为二进制文件处理
在.gitattributes文件中设置:文件名 + binary
比较二进制文件:
1,通过Git属性,告诉Git怎么把二进制文件转化为文本格式,从而能够使用diff方式进行对比
实例:
1,使用Git diff 实现比较Word文档
1,设置以.docx结尾的文件的过滤器为word
在.gitattributes文件中设置:*.docx diff=word
2,设置word过滤器
1,安装docx2txt
2,在可执行路径下创建docx2txt文件,将输出结果包装成Git支持的格式
#!/bin/bash
docx2txt.pl $1 -
3,给docx2txt文件添加可执行权限
chmod a+x docx2txt
4,配置Git使用这个脚本
git config diff.word.textconv docx2txt
3,git diff比较word文档
自定义属性 – 关键字展开
缺点:无法利用关键字展开功能往文件中加入其关联提交的相关信息
1,在检出某个文件后对其注入文本,并且再次提交前删除这些文本。
实现方法一:
1,把文件所对应的数据对象的SHA-1校验和自动注入到文件中的$ID字段。
$ echo '*.txt ident' >> .gitattributes
$ echo '$Id$' > test.txt
$ rm test.txt
$ git checkout -- test.txt
$ cat test.txt
$Id: 42812b7653c7b88933f8a9d6cad0ca16714b9bb3 $
问题:无法区分不同SHA-1时间上的先后
2,编写自己的过滤器来实现文件提交或检出时关键字替换
1,一个过滤器由“clean”和“smudge”两个子过滤器组成。
2,在文件.gitattributes文件中,可以对特定的路径设置一个过滤器,然后设置文件检出前的处理脚本(smudge:在文件被检出时触发)和文件暂存前的处理脚本(clean:在文件被暂存时触发)
实例:用indent程序过滤所有C源码
1,在.gitattributes文件中对filter属性设置“indent”过滤器来过滤*.c文件
*.c filter=indent
2,配置Git,让Git知道“indent”过滤器在smudge和clean应该做什么
$ git config --global filter.indent.clean indent
$ git config --global filter.indent.smudge cat
自定义属性 – 导出版本库
1,项目归档时,设置某些文件或者目录不导出
在Git属性文件中加入:文件名/目录名称 export-ignore
2,在导出文件进行部署的时候,可以将git log的格式化和关键字展开处理应用于被export-subst属性标记的部分
实例:
1,创建LAST_COMMIT文件,并在运行git archive的时候自动向它注入最新提交的元数据。
$ echo 'Last commit date: $Format:%cd by %aN$' > LAST_COMMIT
$ echo "LAST_COMMIT export-subst" >> .gitattributes
$ git add LAST_COMMIT .gitattributes
$ git commit -am 'adding LAST_COMMIT file for archives'
$ git archive HEAD | tar xCf ../deployment-testing -
$ cat ../deployment-testing/LAST_COMMIT
Last commit date: Tue Apr 21 08:38:48 2009 -0700 by Scott Chacon
2,用提交信息或者任意的Git注释进行替换
$ echo '$Format:Last commit: %h by %aN at %cd%n%+w(76,6,9)%B$' > LAST_COMMIT
$ git commit -am 'export-subst
使用 git log 的自定义格式化工具git archive 直接使用 git log 的 `pretty=format:`
处理器,并在输出中移除两侧的 `$Format:` 和 `$`
标记。'
$ git archive @ | tar xfO - LAST_COMMIT
Last commit: 312ccc8 by Jim Hill at Fri May 8 09:14:04 2015 -0700
export-subst 使用 git log 的自定义格式化工具
git archive 直接使用 git log 的 `pretty=format:` 处理器,并
在输出中移除两侧的 `$Format:` 和 `$` 标记。
自定义属性 – 合并策略
对项目中特定文件制定不同的合并策略。
1,当Git中特定文件发生冲突时不要尝试合并他们,而是直接使用你这边的内容。
目的:合并特性分支到当前分支,但是合并时忽略特性分支中某些文件
设置属性:文件名 merge=ours -- 设置合并策略为ours
定义虚拟的合并策略ours:git config --global merge.ours.driver true