zoukankan      html  css  js  c++  java
  • git 操作二进制文件

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

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

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

    image-20210603222409788

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

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

    配置文件解析工具

    1.安装解析工具docx2txt

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

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

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

    image-20210603222925336

    漂亮, 成功识别出了其中的文本信息. 接下来就是告诉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的结果:

    image-20210603224626244

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

    当然, 既然是命令, 也就是说, 能够将文件转换成文本的, 都可以被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, 等等, 都有详细的文档. 问一美中不足的, 就是文档时全英文的, 对于我这种英文水平有限的人来说, 阅读还有有点费劲...

  • 相关阅读:
    Spring Boot:拦截器与过滤器
    [Locked] Maximum Size Subarray Sum Equals k
    [Locked] Generalized Abbreviation
    [Locked] Meeting Room I && II
    [Locked] Zigzag Iterator
    [Locked] Paint House I & II
    [Locked] Number of Connected Components in an Undirected Graph
    [Locked] Best Meeting Point
    [Locked] Sparse Matrix Multiplication
    [Locked] Two Sum
  • 原文地址:https://www.cnblogs.com/hujingnb/p/14852681.html
Copyright © 2011-2022 走看看