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, 等等, 都有详细的文档. 问一美中不足的, 就是文档时全英文的, 对于我这种英文水平有限的人来说, 阅读还有有点费尽…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建个人博客

一直都想着搞一个自己的个人博客, 拖着这么久, 最近终于开始动手了. 故留下一篇完整的记录, 若你也刚好有相同的需要, 那这篇文章应该恰好能够帮助到你. 准备 云服务器个人域名 如果没有云服务器, 将应用跑在自己的电脑上, 通过内网穿透大概也能达到效果, 但是个人电脑实在没…

nginx 配置文件的匹配规则

引出 之前在对php-fpm 进行nginx代理时, 为了对后台限定 IP 访问, 添加了如下配置: location ^~ /admin {allow 127.0.0.1;deny all; }结果呢? 所有admin路径下的php文件, 全都没有解析, 变成文件下载了. 当时我不知道是什么问题, 不过将这段配置去掉之后, 问题就消失了. 所…

计算机是如何进行时间同步的

WHY 在网络世界中, 各个计算机之间要想协同工作, 时间同步是一个十分重要的基础. 在计算机内部是有自己的时间的, 这个时间通过内部的晶体振荡器差生的固定频率, 来模拟时间流逝进行计算. 虽然频率十分稳定, 但也是有误差的, 虽然现在的工艺水平误差已经十分小了. (关于震荡的…

WordPress架构简单剖析

前言 最近在搭建自己的博客站点时, 选择了网站使用较多的WordPress, 随着慢慢的使用, 它灵活的插件和主题令我折服. 基本上任何想要实现的功能, 都可以在上面通过插件的形式进行添加. 无论是在访问前的缓存、访问后的统计、访问中的过滤、各种流程的修改等等, 几乎都能够以插件…

阿里云定时任务并自动释放

前言 最近写了一个爬虫脚本, 脚本跑在一台北京的 ecs 上. 但奈何因某种未知力量, 需要连接代理才能访问目标网站. 本来想着自己搭代理, 但是太贵了, 就暂时搁置了. 直到我发现了这个: 阿里云香港的服务器, 一个小时才5分钱. 如果脚本直接跑在香港服务器上不就可以了咩, 按照这…

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…

PHP-PDO参数绑定问题

前言 今天在执行这样一段代码: $data [username > hujingnb,address > beijing, ]; $dbh new PDO("mysql:host{$host};dbname{$dbname}", $username, $password); $statement $dbh->prepare(INSERT INTO test_user (username, address) VALUES (:usern…

Python 的协程

前言 最近在看部分Python源码时, 发现了async 这个关键字. 查了一下发现了Python中的协程. 协程这玩意, 在GO中我用过啊, 简单说, 就是一个轻量级的线程嘛, 由语言自己来实现不同协程的调度. 想着Python中可能也是差不多的东西吧. 但是我Google搜了一下, 前面的说明都给出了下…

虚拟内存分页机制的地址映射

概述 在之前的文章虚拟内存对分页机制做了简单的介绍. 还有一个疑问, 那就是如何将虚存中的逻辑地址映射为物理地址呢? 今天就来简单分析一下. 对于一个分页的地址来说, 一般包含两个元素: 页号: 第几页偏移量: 当前页的第几个字节 以下以 addr_virtual(p, o)表示一个逻辑…

虚拟内存分页机制的页面置换

前言 之前简单介绍过虚拟内存是如何与物理内存进行地址映射的: 虚拟内存分页机制的地址映射, 但是仅仅地址映射是不够的, 在地址映射说过会有缺页的情况, 此时就需要操作操作系统将缺少的页加载到内存中. 但是, 如果内存满了怎么办呢? 毕竟虚拟内存一般都要大于物理内存的, 不…

Kubernetes各个组件的概念

前言 Kubernetes中的概念太多了, 什么Pod Service Deployment 等等等等, 给刚接触的我都整蒙了. 通过几天观察下来, 说一下我对各个组件的理解. 此文章仅仅对这些概念做一个简单的介绍, 不至于后面看其他文章的时候一头雾水. Node Node很好理解. 就是服务实际运行的实例, 可…

Kubernetes中Pod生命周期

在 Kubernetes中Pod是容器管理的最小单位, 有着各种各样的Pod管理器. 那么一个Pod从启动到释放, 在这期间经历了哪些过程呢? Pod自开始创建, 到正常运行, 再到释放, 其时间跨度及经历的阶段大致如下: 说一下各个阶段的作用以及是为了解决什么问题. 容器调度和下载镜像的过程就…

wait函数的作用

前言 在编写C程序的时候, 通过fork函数来创建新的进程, wait函数来等待子进程结束. 那么就有一个问题了, 什么情况下父进程需要等待子进程结束后继续执行呢? 如果需要等待子进程结束, 那直接将操作放到父进程执行不就醒了么? 反正等着也是等着. 当然, 还有有一种情况, 任务…

OAuth1.0介绍

背景 为什么需要OAuth授权呢? 最典型的应用场景就是第三方登录了, 我们开发了一个网站希望用户可以QQ登录, 但是怎么能拿到用户的 QQ 信息呢? 用户将 账号密码告诉我们当然可以, 但是这样有如下隐患: 我们拿到了用户的密码, 这样很不安全. 而且任意一个应用被黑, 所有相关…

PHP 数组的内部实现

前言 这几天在翻github的时候, 碰巧看到了php的源码, 就 down 下来随便翻了翻. 地址: https://github.com/php/php-src 那么PHP中什么玩意最引人注目嘞? 一定是数组了, PHP中的数组太强大了, 于是就想着不如进去看看数组的实现部分. 这篇文章打算全程针对代码进行解读了. 以…

base64编码原理

引出 众所周知, ASICC编码共127个, 使用了7个bit进行编码. 而文件在存储的时候是以 字节为单位, 也就是8bit. 这就难免导致有一部分编码是没有定义在ASICC编码中的. 而在网络中传输二进制数据的时候(字符串本质上也是二进制数据嘛), 如果直接传输比特流, 倒也不是不可以, 只是…

页面加载速度-合并资源文件

前言 一直觉得自己的博客站点页面加载很慢, 就想着去优化一下. 呐, 下图是一次文章页面的加载, 需要2.5s. 其中 js 文件就有18个. 众所周知, 浏览器对资源文件的并行下载数量是有限制的(不同浏览器限制不同). 也就是说, 这18个 js 文件是无法同时下载的, 再说了, 页面中还有其…

hbase/thrift/go连接失败

问题 在通过Go连接hbase的过程中, 发现 get操作可以查到数据, 但是scanner命令访问数据失败, 也没有报错, 就是单纯的查不到数据. 而且Python PHP都一切正常. 这里简单复述一下我出现问题的情况, 安装过程和网上大部分内容一致, 这里简单列一下, 只是为了查询问题时参考安装过…

printf缓冲区踩坑

问题 碰到了这样一段代码(经过简化的): #include "stdio.h" #include "unistd.h" #include "sys/wait.h"int main(){fork();printf("1\n");fork();printf("1\n");wait(NULL);return 0; }这里我们简单算一下, 结果会打印几…

进程切换时是如何保存上下文的

前言 当前操作系统大部分采用分时的进程调度, 既每个进程运行一小段时间, 然后切换到下一个进程运行, 依次往复. 当进程运行的时候是独占CPU的, 此时操作系统是无法强行介入的, 为了将执行权让出来, 就需要硬件的配合了. 硬件每个一个时钟周期(比如10ms), 就会产生一个时钟中…