平常用git
进行项目管理已经稀松平常了, 今天咱来点不一样的.
平常管理的都是普通的文本文件, 如果是二进制文件, git
能够处理么? 比如word
文档. 测试一下.
新建一个项目, 在其中创建test1.docx
, test2.txt
两个空文件并提交. 之后编辑文件并添加标题, git diff
看一下效果:
效果很明显, 文本文档能够清楚的看到变动, 而二进制文件不行. 这对于需要对这种二进制文件进行版本管理的需求来说, 有些不尽人意. 如此, 这版本管理有和没有也没什么两样, 你也不知道在那次修改了哪些内容.
那么有没有办法能够让git
对word
文档进行识别呢? 有的, 这需要借助第三方工具来帮助git
对文件进行解析.
配置文件解析工具
1.安装解析工具docx2txt
地址: https://sourceforge.net/projects/docx2txt
安装过程很简单, 其中的 INSTALL
文件有教, mac
用户直接执行make
即可, make
后默认安装在了/usr/local/bin
路径下.
下载来试一下这个工具吧: docx2txt.pl test1.docx
漂亮, 成功识别出了其中的文本信息. 接下来就是告诉git
怎么 使用它了.
2.给git
配置解析工具
首先, 要有一个供git
调用的命令, 姑且就叫git_docx2txt
, 那么这个命令从那来呢? 建, 在可执行路径下创建git_docx2txt
文件, 我就是在/usr/local/bin
目录下创建的. 通过此命令进行转换 , 其内容为:
#!/bin/bash
docx2txt.pl "$1" -
创建完不要忘记给文件添加可执行权限. chmod a+x git_docx2txt
现在, 解析工具已经有了, 接着就是把这个工具告诉 git
就好啦.
git config --local diff.word.textconv git_docx2txt
上面命令告诉git
, 有一个叫做word
的文本解析器, 使用的命令是git_docx2txt
. 我这里因为是测试需要, 就配到了项目下. 如果有需要也可以做全局配置哦.
好, 现在git
已经知道这个解析器了, 但是还需要告诉它哪些文件要使用这个工具进行解析.
此时用到了一个文件: .gitattributes
, 用于项目的属性配置, 当然, 如果不想提上去的话, 也可以修改.git/info/attributes
文件. 添加以下内容:
*.docx diff=word
此文件告诉git
, 所有.docx
结尾的文件, 使用word
工具进行diff
.
好, 大功告成, 重新看一下diff
的结果:
不过能够看得出来, 其只能比较文字内容的差异, 而拿不到格式的差异.
当然, 既然是命令, 也就是说, 能够将文件转换成文本的, 都可以被git
引用进来进行差异比较. 比如使用·exiftool·比较图片的差异, 包括大小、宽高等
gitattributes 文件其他用途
既然用到.gitattributes
文件了, 就顺便也来看看他的其他作用吧.
设置的格式为:
*.txt 属性1 属性2
具体文档可通过命令: man gitattributes
查看.
每个属性有如下状态, 以text
举例:
- text : 既默认值为 true
- -text: false
- text=string : 指定一个值
- 未声明
text
启用行尾换行符的转换. (因为在 windows 和 linux 中, 换行符表示不同, 所以需要进行转换才能正确显示, 大概只在 windows 下开发用的到吧)
- true: 标记为文本文件, 并进行换行符转换
- false: 标记为非文本文件, 不进行换行符的转换
- auto: 自动识别
- 未声明: 使用
core.autocrlf
属性
eol
设置行尾的换行符规则. 不在 Windows 下开发估计也用不到了.
- crlf
- lf
working-tree-encoding
如果你的文件不是使用 utf8编码, 则 git 无法识别, 此属性告诉git
应该使用什么编码来读取文件.
git
会将文件按照指定编码识别, 并使用utf8
保存在git
历史中, 当检出时, 输出为指定编码的文件.
对了, 可以通过iconv --list
命令开查看你当前支持的所有编码. 同时, 如果你不知道文件的编码, 可以通过命令: file a.txt
文件来尝试识别编码.
此属性甚至可以实现文件编码的批量修改, 操作步骤如下:
- 在一个有文件
a.txt
的分支A 上, 将其提上去 - 切换到一个没有
a.txt
文件的分支B - 修改
.git/info/attributes
文件中a.txt
的编码 - 此时再切换到分支 A
-
git
在对文件进行重写时, 会进行编码的转换. 此时文件a.txt
的编码已经改变了
diff
diff
属性在之前处理word
文档的时候就已经用过了.
- diff : 声明为文本格式
- -diff : 声明为二进制
- diff=test : 指定应用程序
指定的diff
模式, 定义在: .git/config
或 ~/.gitconfig
文件中. 它不光可以通过命令来做二进制文件的转换, 还可以添加自定义单词差异等, 不过我试了一下内置的PHP
, 没看出有什么差别..
其他
还支持一些其他属性, 如: merge
, filter
, whitespace
, conflict-marker-size
等等. 就不一一列出了, 感兴趣的可以通过 man gitattributes
查看文档.
git
的文档写的还是挺详细的, man git
, man git-add
, 等等, 都有详细的文档. 问一美中不足的, 就是文档时全英文的, 对于我这种英文水平有限的人来说, 阅读还有有点费劲...