git 操作二进制文件
平常用git進(jìn)行項(xiàng)目管理已經(jīng)稀松平常了, 今天咱來點(diǎn)不一樣的.
平常管理的都是普通的文本文件, 如果是二進(jìn)制文件, git能夠處理么? 比如word文檔. 測試一下.
新建一個(gè)項(xiàng)目, 在其中創(chuàng)建test1.docx, test2.txt兩個(gè)空文件并提交. 之后編輯文件并添加標(biāo)題, git diff看一下效果:
效果很明顯, 文本文檔能夠清除的看到變動, 而二進(jìn)制文件只能看到. 這對于需要對這種二進(jìn)制文件進(jìn)行版本管理的需求來說, 有些不盡人意. 如此, 這版本管理有和沒有也沒什么兩樣, 你也不知道在那次修改了哪些內(nèi)容.
那么有沒有辦法能夠讓git對word文檔進(jìn)行識別呢? 有的, 這需要借助第三方工具來幫助git對文件進(jìn)行解析.
配置文件解析工具
1.安裝解析工具docx2txt
地址: https://sourceforge.net/projects/docx2txt
安裝過程很簡單, 其中的 INSTALL文件有教, mac 用戶直接執(zhí)行make即可, make后默認(rèn)安裝在了/usr/local/bin路徑下.
下載來試一下這個(gè)工具吧: docx2txt.pl test1.docx
漂亮, 成功識別出了其中的文本信息. 接下來就是告訴git怎么 使用它了.
2.給git配置解析工具
首先, 要有一個(gè)供git調(diào)用的命令, 姑且就叫g(shù)it_docx2txt, 那么這個(gè)命令從那來呢? 建, 在可執(zhí)行路徑下創(chuàng)建git_docx2txt文件, 我就是在/usr/local/bin目錄下創(chuàng)建的. 通過此命令進(jìn)行轉(zhuǎn)換 , 其內(nèi)容為:
#!/bin/bash docx2txt.pl "$1" -創(chuàng)建完不要忘記給文件添加可執(zhí)行權(quán)限. chmod a+x git_docx2txt
現(xiàn)在, 解析工具已經(jīng)有了, 接著就是把這個(gè)工具告訴 git就好啦.
git config --local diff.word.textconv git_docx2txt
上面命令告訴git, 有一個(gè)叫做word的文本解析器, 使用的命令是git_docx2txt. 我這里因?yàn)槭菧y試需要, 就配到了項(xiàng)目下. 如果有需要也可以做全局配置哦.
好, 現(xiàn)在git已經(jīng)知道這個(gè)解析器了, 但是還需要告訴它哪些文件要使用這個(gè)工具進(jìn)行解析.
此時(shí)用到了一個(gè)文件: .gitattributes, 用于項(xiàng)目的屬性配置, 當(dāng)然, 如果不想提上去的話, 也可以修改.git/info/attributes文件. 添加以下內(nèi)容:
*.docx diff=word此文件告訴git, 所有.docx結(jié)尾的文件, 使用word工具進(jìn)行diff.
好, 大功告成, 重新看一下diff的結(jié)果:
不過能夠看得出來, 其只能比較文字內(nèi)容的差異, 而拿不到格式的差異.
當(dāng)然, 既然是命令, 也就是說, 能夠?qū)⑽募D(zhuǎn)換成文本的, 都可以被git引用進(jìn)來進(jìn)行差異比較. 比如使用·exiftool·比較圖片的差異, 包括大小、寬高等
gitattributes 文件其他用途
既然用到.gitattributes文件了, 就順便也來看看他的其他作用吧.
設(shè)置的格式為:
*.txt 屬性1 屬性2具體文檔可通過命令: man gitattributes 查看.
每個(gè)屬性有如下狀態(tài), 以text舉例:
- text : 既默認(rèn)值為 true
- -text: false
- text=string : 指定一個(gè)值
- 未聲明
text
啟用行尾換行符的轉(zhuǎn)換. (因?yàn)樵?windows 和 linux 中, 換行符表示不同, 所以需要進(jìn)行轉(zhuǎn)換才能正確顯示, 大概只在 windows 下開發(fā)用的到吧)
- true: 標(biāo)記為文本文件, 并進(jìn)行換行符轉(zhuǎn)換
- false: 標(biāo)記為非文本文件, 不進(jìn)行換行符的轉(zhuǎn)換
- auto: 自動識別
- 未聲明: 使用core.autocrlf屬性
eol
設(shè)置行尾的換行符規(guī)則. 不在 Windows 下開發(fā)估計(jì)也用不到了.
- crlf
- lf
working-tree-encoding
如果你的文件不是使用 utf8編碼, 則 git 無法識別, 此屬性告訴git應(yīng)該使用什么編碼來讀取文件.
git會將文件按照指定編碼識別, 并使用utf8保存在git歷史中, 當(dāng)檢出時(shí), 輸出為指定編碼的文件.
對了, 可以通過iconv --list命令開查看你當(dāng)前支持的所有編碼. 同時(shí), 如果你不知道文件的編碼, 可以通過命令: file a.txt 文件來嘗試識別編碼.
此屬性甚至可以實(shí)現(xiàn)文件編碼的批量修改, 操作步驟如下:
diff
diff屬性在之前處理word文檔的時(shí)候就已經(jīng)用過了.
- diff : 聲明為文本格式
- -diff : 聲明為二進(jìn)制
- diff=test : 指定應(yīng)用程序
指定的diff模式, 定義在: .git/config 或 ~/.gitconfig 文件中. 它不光可以通過命令來做二進(jìn)制文件的轉(zhuǎn)換, 還可以添加自定義單詞差異等, 不過我試了一下內(nèi)置的PHP, 沒看出有什么差別…
其他
還支持一些其他屬性, 如: merge, filter, whitespace, conflict-marker-size 等等. 就不一一列出了, 感興趣的可以通過 man gitattributes查看文檔.
git的文檔寫的還是挺詳細(xì)的, man git, man git-add, 等等, 都有詳細(xì)的文檔. 問一美中不足的, 就是文檔時(shí)全英文的, 對于我這種英文水平有限的人來說, 閱讀還有有點(diǎn)費(fèi)盡…
總結(jié)
以上是生活随笔為你收集整理的git 操作二进制文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java set循环取值_java循环遍
- 下一篇: 如何将数字转换成口语中的文本串