首页 > 解决方案 > git diff 不适用于 Word 文档、--intent-to-add 和 pandoc diff 驱动程序

问题描述

可以在 Internet 上找到的几个教程([1][2][3])建议使用以下配置来区分git.

  1. 使用以下设置配置“pandoc”差异驱动程序:

    [diff "pandoc"]
        textconv=pandoc --to=markdown
        prompt = false
    
  2. 将以下内容添加到您的.gitattributes文件中:

    *.docx diff=pandoc
    

这似乎工作正常,除非在表明打算将其添加到 git 存储库之后尝试区分未跟踪的 Word 文档。有谁知道为什么这在这种情况下不起作用?

以下是重现的步骤,假设上面详述了以下配置。

  1. 在 git 存储库中创建 Word 文档

    touch my_document.docx
    
  2. 在 Microsoft Word 中打开文件,在 Word 文档中添加一些内容(例如,字符“asdf”),然后保存

  3. 表明您打算添加文档

    git add -N my_document.docx
    
  4. 尝试查看差异:

    git diff my_document.docx
    #> couldn't parse docx file
    #> fatal: unable to read files to diff
    

在 macOS 上使用git2.17.1 版本时,我最终会遇到“致命:无法读取文件以进行比较”错误。但是,只需将文件添加到索引然后运行git diff --cached会导致以下差异:

diff --git a/my_document.docx b/my_document.docx
new file mode 100644
index 0000000..17f1b0d
--- /dev/null
+++ b/my_document.docx
@@ -0,0 +1 @@
+asdf

为什么 diff 驱动程序不能使用git add -N

标签: gitdiffpandocgit-diffgit-add

解决方案


这最终是由于pandoc --to=markdown /dev/null/正确返回任何内容而不会出错,而pandoc --to=markdown a/my_document.docx错误输出以防万一a/my_document.docx是空文件。

因此,如果您my_document.docx第一次添加到索引中,然后运行git diff --cached将索引与 HEAD 进行比较,则比较将反对/dev/null,一切都会正常工作。

但是,如果您已表明您打算添加一个新文件,my_document.docxgit add -N,一个具有相同名称的空文件将被添加到索引中。在这种情况下,pandoc尝试将索引中的空文件转换为 Markdown 时会出错。


推荐阅读