3

在 git 中,我尝试使用.gitattributesdifftool 比较 .odt 文件、libreofice 编写器文件。从遵循本指南: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.

...文件中的所有字符都是胡说八道。

什么地方出了错?我该如何解决?

PS:

我不知道这是否重要,但我想我没有配置'diff.tool',因为每次我命令时:

$ 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 文档执行此操作,并在此处更进一步。

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

当我在其中一个显示的文件上按 Enter 键时:

<?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>

我在这里发布了一个关于这个问题的新问题。

4

2 回答 2

2

除了 , 您还需要.gitattribute配置什么意思odf

git config diff.odf.textconv odt2txt

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

无需配置difftoolkdiff3默认即可。
kdiff3需要打开一个文本文件,因此需要odt2txt(为了首先将文档转换为文本文件)


有关更多信息textconv,请参阅“执行二进制文件的文本差异”:

有时希望查看某些二进制文件的文本转换版本的差异。例如,可以将文字处理器文档转换为 ASCII 文本表示,并显示文本的差异。
尽管这种转换会丢失一些信息,但生成的差异对于人类查看很有用(但不能直接应用)。

textconvconfig 选项用于定义执行此类转换的程序。该程序应采用单个参数,即要转换的文件的名称,并在标准输出上生成结果文本。

笔记

文本转换一般是单向转换;这意味着由 生成的差异textconv不适合应用。

出于这个原因,只有git diffgit log命令系列(即 , log, whatchangedshow才会执行文本转换。
git format-patch永远不会产生这个输出。

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


OP Jack在评论中提到:

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

$ git config diff.odf.textconv odt2txt

我已经odt2txt安装了...并且我假设odt2txt是在 中$PATH,因为当我运行时$ odt2txt,我会得到关于odt2txt. 但是,由于某种原因
,这些东西似乎都没有生成文件。 当 I 时,我仍然得到二进制文件 fileone.odt 和 filetwo.odt 的输出不同,而不是文本如何区分。 不知道为什么它不起作用。git diff .odt
$ git diff fileone.odt filetwo.odt

于 2015-10-31T05:24:01.180 回答
0

我的猜测是你的情况是kdiff3

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

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

kdiff3有很多可以在 ~/.kdiff3rc 配置文件中设置的配置选项(这里是示例)。我会玩一些与编码和字体相关的东西。例如,从更改字体开始,例如

Font=Arial

顺便说一句,当您使用编辑器打开这些 odt 文件时 - 您可以阅读哪种字体?

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

于 2015-12-02T22:08:23.140 回答