如何使用difftool来区分.odt文件? kdiff3 diff输出不可读的字符

时间:2015-10-31 05:06:59

标签: git diff batch-processing git-difftool

在git中,我尝试使用.gitattributes来比较.odt文件,libreofice编写器文件和difftool。 从以下指南开始:http://www-verimag.imag.fr/~moy/opendocument/我创建了一个.gitattributes文件.gitattributes:

*.ods diff=odf
*.odt diff=odf
*.odp diff=odf

*.ods difftool=odf
*.odt difftool=odf
*.odp difftool=odf

这使得git diff比较.odt中的文本,但是当git difftool启动kdiff3来比较.odt文件时,我收到此弹出错误:

Some input characters could not be converted to valid unicode.
You might be using the wrong codec. (e.g. UTF-8 for non UTF-8 files).
Don't save the result if unsure. Continue at your own risk.
Affected input files are in A, B.

...文件中的所有字符都是mumbo jumbo。

出了什么问题?我该如何解决这个问题?

PS:

我不知道这是否重要,但我想我还没有配置“差异工具”,因为每次我命令:

$ git difftool 

我得到了这个输出:

This message is displayed because 'diff.tool' is not configured.
See 'git difftool --tool-help' or 'git help config' for more details.
'git difftool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld kompare gvimdiff diffuse diffmerge ecmerge p4merge araxis bc codecompare emerge vimdiff

Viewing (1/1): 'diffexperiment.odt'
Launch 'kdiff3' [Y/n]:

这可能就是为什么kdiff3似乎不适用于odt2txt?

编辑:我重新尝试使用Microsoft Word文档,并进一步here

我玩.kdiff3rc配置...我添加的选项似乎没有让不可读的字符可读。 我将比较工具改为vimdiff;当我在微软word文档上执行git difftool时,vimdiff显示了以.xml结尾的文件列表,而不是不可读的字符。

当我按下输入显示的其中一个文件时:

<?xml version="1.0" encoding="UTF-8"?>
  " Browsing zipfile /tmp/4LMJbj_HI I am writing something here..docx                          |<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Override PartName
  " Select a file with cursor and press ENTER                                                  |="/_rels/.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Overr
                                                                                               |ide PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.w
  _rels/.rels                                                                                  |ordprocessingml.settings+xml"/><Override PartName="/word/_rels/document.xml.rels" ContentType=
  word/settings.xml                                                                            |"application/vnd.openxmlformats-package.relationships+xml"/><Override PartName="/word/fontTabl
  word/_rels/document.xml.rels                                                                 |e.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+x
  word/fontTable.xml                                                                           |ml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officed
  word/numbering.xml                                                                           |ocument.wordprocessingml.styles+xml"/><Override PartName="/word/document.xml" ContentType="app
  word/styles.xml                                                                              |lication/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/><Override Part
  word/document.xml                                                                            |Name="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-p
  docProps/app.xml                                                                             |roperties+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlfo
  docProps/core.xml                                                                            |rmats-package.core-properties+xml"/>
  [Content_Types].xml                                                                          |</Types>

我在此问题上发布了一个新问题here

2 个答案:

答案 0 :(得分:2)

除了.gitattribute之外,您还需要配置 odf的含义:

git config diff.odf.textconv odt2txt

您需要$PATH (Linux/Mac)%PATH%(Windows)中的odt2txt(从OpenDocument文本到纯文本的简单转换)。

无需配置difftool,因为默认情况下kdiff3就足够了 但是kdiff3需要打开一个文本文件,因此需要odt2txt(为了首先将文档转换为文本文件)

有关textconv的详情,请参阅&#34; Performing text diffs of binary files&#34;:

  

有时需要查看某些二进制文件的文本转换版本的差异。例如,可以将文字处理器文档转换为ASCII文本表示,并显示文本的差异   即使这种转换失去了一些信息,生成的差异对人类观看也很有用(但不能直接应用)。

     

textconv配置选项用于定义执行此类转换的程序。该程序应该采用一个参数,即要转换的文件的名称,并在stdout上生成结果文本。

     

注意

     

文字转换通常是单向转换;这意味着textconv生成的差异不适合应用。

     

因此,只有git diffgit log系列命令(即logwhatchangedshow)才能执行文本转换。<登记/>   git format-patch永远不会生成此输出。

     

如果你想向某人发送二进制文件的文本转换差异(例如,因为它会快速传达你所做的更改),你应该单独生成它并将其作为注释发送,除了通常的二进制差异你可能发送。

OP Jack提及in the comments

  

在Linux上,我在我的主目录中运行:

$ git config diff.odf.textconv odt2txt
  

我安装了odt2txt ...我认为odt2txt位于$PATH,因为当我运行$ odt2txt时,我会获得有关odt2txt的信息。
  但是,由于某种原因,这些内容似乎都不会产生git diff .odt个文件   当我$ git diff fileone.odt filetwo.odt时,我仍然得到二进制文件的输出fileone.odt和filetwo.odt不同,而不是文本区分的确切方式。
  不知道为什么它不起作用。

答案 1 :(得分:0)

我猜你的情况是 kdiff3

  

某些输入字符无法转换为有效的unicode。您   可能使用了错误的编解码器。 (例如UTF-8用于非UTF-8文件)....

抱怨,因为它无法找到特定字体的某个字符的字形,即它无法绘制它们(它们)。

kdiff3 有很多可以在〜/ .kdiff3rc配置文件中设置的配置选项(例如here)。我会玩一些与编码和字体有关的内容。例如,从更改字体开始,例如

Font=Arial

顺便说一下,当你用你的编辑器打开这些odt文件时 - 它对你来说是可读的吗?

PS 选项也可以在命令行中传递给kdiff3: kdiff3 --cs&#34; Option1 = Val1&#34; --cs&#34; Option2 = Val2&#34; --cs ...