git 操作二进制文件

平常用git进行项目管理已经稀松平常了, 今天咱来点不一样的.

平常管理的都是普通的文本文件, 如果是二进制文件, git能够处理么? 比如word文档. 测试一下.

新建一个项目, 在其中创建test1.docx, test2.txt两个空文件并提交. 之后编辑文件并添加标题, git diff看一下效果:

git 操作二进制文件

效果很明显, 文本文档能够清楚的看到变动, 而二进制文件不行. 这对于需要对这种二进制文件进行版本管理的需求来说, 有些不尽人意. 如此, 这版本管理有和没有也没什么两样, 你也不知道在那次修改了哪些内容.

那么有没有办法能够让gitword文档进行识别呢? 有的, 这需要借助第三方工具来帮助git对文件进行解析.

配置文件解析工具

1.安装解析工具docx2txt

地址: https://sourceforge.net/projects/docx2txt

安装过程很简单, 其中的 INSTALL文件有教, mac 用户直接执行make即可, make后默认安装在了/usr/local/bin路径下.

下载来试一下这个工具吧: docx2txt.pl test1.docx

git 操作二进制文件

漂亮, 成功识别出了其中的文本信息. 接下来就是告诉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 操作二进制文件

不过能够看得出来, 其只能比较文字内容的差异, 而拿不到格式的差异.

当然, 既然是命令, 也就是说, 能够将文件转换成文本的, 都可以被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 文件来尝试识别编码.

此属性甚至可以实现文件编码的批量修改, 操作步骤如下:

  1. 在一个有文件a.txt的分支A 上, 将其提上去
  2. 切换到一个没有a.txt文件的分支B
  3. 修改.git/info/attributes文件中a.txt的编码
  4. 此时再切换到分支 A
  5. 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, 等等, 都有详细的文档. 问一美中不足的, 就是文档时全英文的, 对于我这种英文水平有限的人来说, 阅读还有有点费劲...

上一篇:CTFHub Git泄露-log解题思路


下一篇:教你阅读vue源码的正确姿势,看完就学废!