git diff 不适用于 Word 文档、--intent-to-add 和 pandoc diff 驱动程序

git diff not working with Word document, --intent-to-add, and pandoc diff driver

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

跟踪的 Word 文档
  1. 使用以下设置配置 "pandoc" diff 驱动程序:

    [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 上使用 git 版本 2.17.1,我最终遇到 "fatal: unable to read files to diff" 错误。但是,仅将文件添加到索引然后 运行 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 一起工作?

这最终是由于 pandoc --to=markdown /dev/null/ 正确地 returns 没有错误输出,而 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 时会出错。