一些设置项也能被运用于特定的路径中,这样,Git 以对一个特定的子目录或子文件集运用那些设置项。这些设置项被称为 Git 属性,可以在你目录中的.gitattributes
文件内进行设置(通常是你项目的根目录),也可以当你不想让这些属性文件和项目文件一同提交时,在.git/info/attributes
进行设置。
使用属性,你可以对个别文件或目录定义不同的合并策略,让 Git 知道怎样比较非文本文件,在你提交或签出前让 Git 过滤内容。你将在这部分了解到能在自己的项目中使用的属性,以及一些实例。
二进制文件
你可以用 Git 属性让其知道哪些是二进制文件(以防 Git 没有识别出来),以及指示怎样处理这些文件,这点很酷。例如,一些文本文件是由机器产生的,而且无法比较,而一些二进制文件可以比较 — 你将会了解到怎样让 Git 识别这些文件。
识别二进制文件
一些文件看起来像是文本文件,但其实是作为二进制数据被对待。例如,在Mac上的Xcode项目含有一个以.pbxproj
结尾的文件,它是由记录设置项的IDE写到磁盘的JSON数据集(纯文本Javascript数据类型)。虽然技术上看它是由ASCII字符组成的文本文件,但你并不认为如此,因为它确实是一个轻量级数据库 — 如果有2人改变了它,你通常无法合并和比较内容,只有机器才能进行识别和操作,于是,你想把它当成二进制文件。
让 Git 把所有pbxproj
文件当成二进制文件,在.gitattributes
文件中设置如下:
*.pbxproj -crlf -diff
现在,Git 会尝试转换和修正CRLF(回车换行)问题,也不会当你在项目中运行git show或git diff时,比较不同的内容。在Git 1.6及之后的版本中,可以用一个宏代替-crlf -diff
:
*.pbxproj binary
比较二进制文件
在Git 1.6及以上版本中,你能利用 Git 属性来有效地比较二进制文件。可以设置 Git 把二进制数据转换成文本格式,用通常的diff来比较。
这个特性很酷,而且鲜为人知,因此我会结合实例来讲解。首先,要解决的是最令人头疼的问题:对Word文档进行版本控制。很多人对Word文档又恨又爱,如果想对其进行版本控制,你可以把文件加入到 Git 库中,每次修改后提交即可。但这样做没有一点实际意义,因为运行git diff
命令后,你只能得到如下的结果:
$ git diff
diff --git a/chapter1.doc b/chapter1.doc
index 88839c4..4afcb7c 100644Binary files a/chapter1.doc and b/chapter1.doc differ
你不能直接比较两个不同版本的Word文件,除非进行手动扫描,不是吗?Git 属性能很好地解决此问题,把下面的行加到.gitattributes
文件:
*.doc diff=word
当你要看比较结果时,如果文件扩展名是"doc",Git 调用"word"过滤器。什么是"word"过滤器呢?其实就是 Git 使用strings
程序,把Word文档转换成可读的文本文件,之后再进行比较:
$ git config diff.word.textconv strings
现在如果在两个快照之间比较以.doc
结尾的文件,Git 对这些文件运用"word"过滤器,在比较前把Word文件转换成文本文件。
下面展示了一个实例,我把此书的第一章纳入 Git 管理,在一个段落中加入了一些文本后保存,之后运行git diff
命令,得到结果如下:
$ git diff
diff --git a/chapter1.doc b/chapter1.doc
index c1c8a0a..b93c9e4 100644--- a/chapter1.doc+++ b/chapter1.doc@@ -8,7 +8,8 @@ re going to cover Version Control Systems (VCS) and Git basics
re going to cover how to get it and set it up for the first time if you don
t already have it on your system.In Chapter Two we will go over basic Git usage - how to use Git for the 80%-s going on, modify stuff and contribute changes. If the book spontaneously+s going on, modify stuff and contribute changes. If the book spontaneously+Let's see if this works.
Git 成功且简洁地显示出我增加的文本"Let’s see if this works"。虽然有些瑕疵,在末尾显示了一些随机的内容,但确实可以比较了。如果你能找到或自己写个Word到纯文本的转换器的话,效果可能会更好。 strings
可以在大部分Mac和Linux系统上运行,所以它是处理二进制格式的第一选择。
你还能用这个方法比较图像文件。当比较时,对JPEG文件运用一个过滤器,它能提炼出EXIF信息 — 大部分图像格式使用的元数据。如果你下载并安装了exiftool
程序,可以用它参照元数据把图像转换成文本。比较的不同结果将会用文本向你展示:
$ echo '*.png diff=exif' >> .gitattributes
$ git config diff.exif.textconv exiftool
如果在项目中替换了一个图像文件,运行git diff
命令的结果如下:
diff --git a/image.png b/image.png
index 88839c4..4afcb7c 100644--- a/image.png+++ b/image.png@@ -1,12 +1,12 @@ExifTool Version Number : 7.74-File Size : 70 kB-File Modification Date/Time : 2009:04:21 07:02:45-07:00+File Size : 94 kB+File Modification Date/Time : 2009:04:21 07:02:43-07:00File Type : PNG
MIME Type : image/png-Image Width : 1058-Image Height : 889+Image Width : 1056+Image Height : 827Bit Depth : 8Color Type : RGB with Alpha
你会发现文件的尺寸大小发生了改变。
!爆享折扣!
▼▼▼
原价129,今日拼团仅需 ¥99!新人专享首单限时优惠 ¥19.9!!!但!仅限前100个名额!???