自定义Git 第二部分

文章参考自: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值