【问题标题】:Display text diffs for binary files on GitHub在 GitHub 上显示二进制文件的文本差异
【发布时间】:2021-01-25 13:16:01
【问题描述】:

我正在尝试使用 Git 和 GitHub 来同步一些应用配置文件。这些是以二进制格式存储的 XML 或 plist 文件。例如,Keyboard Maestro .kmsync file

我可以open these files via a text editor查看 XML 格式。

但是当我在 GitHub 拉取请求、提交视图等中查看这些文件差异时,我看到了一个无用的二进制差异,没有可见的更改:

显示有 0 个添加和 0 个删除。
BIN +17 字节 (100%)
二进制文件未显示。

我可以通过 git 通过 .gitattributes 文件在本地显示基于文本的差异。但是,GitHub 似乎不尊重这些修改:

GitHub 不使用 .gitattributes 文件来选择要在 diff 中显示的文件,因此无法通过这种方式解决此问题。 [source]

当我在 GitHub 上的提交和拉取请求中查看这些文件时,我想查看基于文本的更改和行差异。

例如这里的 GitHub PR。随意分叉和实验:
https://github.com/pkamb/so/pull/1

如何说服 GitHub 存储库 的 Web 视图对某些“二进制”文件使用基于文本的差异?


我找不到针对我的特定问题的现有问题(在 GitHub 上显示非二进制差异 )。

以下问题与此相同行为有关,但针对本地 git(不是 GitHub)。

我的问题是这个问题的相反,它试图在 GitHub 上将文本文件显示为二进制文件:

【问题讨论】:

  • 如何在您的存储库中提供一个指向相应.kmsync 文件的链接以及指向您的.gitattributes 文件的链接?这将使问题更容易重现,并且理论上更少。我不认为期望所有查看您的问题的人(在撰写本文时已经有 42 人)各自创建一个示例存储库,试图复制您的情况。
  • 我刚刚检查过了。 .kmsync 文件是二进制文件!我认为这是一个不小心被视为二进制文件的 XML 文件。您说您可以在文本编辑器中打开该文件并查看 XML。这是不可能的,除非您的编辑器知道如何扩展二进制格式。 GitHub 怎么会知道呢?请解释。我觉得你问的有点太多了。 .gitattributes 文件不能神奇地将二进制文件转换为文本文件,只能告诉 Git 哪些文件应视为二进制文件或文本文件,以防它无法自动执行正确的操作。这在 Git 本地是行不通的,那为什么在 GitHub 上也行呢?
  • 那么它是一个特殊的编辑器或带有特殊插件的那种文件的编辑器。也许它使用 plutil -convert 在您链接到的线程中提到的引擎盖下。我在 Windows 上的编辑器和我的 IDE 肯定无法打开它。
  • 您应该做的是将 XML 文件保存在您的存储库中,并在构建或部署过程中将它们转换为二进制格式,如果您需要这些文件,而不是相反。这是 SCM(源代码管理)最佳实践。那么你也不会再为差异而头疼了。
  • 我认为这在 GitHub 上是不可能的。对某些文件类型(如 pdf)有特殊处理,但我认为您无法配置它。

标签: github diff binaryfiles file-type


【解决方案1】:

没有办法强制 GitHub 将这些文件显示为文本,因为它们不是。当 GitHub 将文件呈现为 HTML 页面的一部分时,它们必须采用某种编码,而如今唯一合理的编码选择是 UTF-8。这些文件无法按原样显示为 UTF-8,因为它们包含在 UTF-8 中无效的字节序列,以及控制字符,这些字符通常无法在网页中很好地呈现。

可以使用配置文件中的diff 类型和diff.*.textconv 属性将这些文件转换为文本以使用.gitattributes 文件进行比较。这在你的机器上很好用,但在 GitHub 上不行。首先,GitHub 没有你渲染文件的工具,其次,GitHub 一般不支持外部程序渲染文件,主要是出于安全原因。支持一些常见格式,但这不是其中之一。

还要注意,要使用的程序存储在Git配置中,而不是.gitattributes文件中;这是故意的,因为在存储库中提供要执行的程序列表是一个安全问题。因此,GitHub 甚至不可能知道你在这里使用的程序。

如果您的kmsync 文件具有可以编译成二进制格式的纯文本等价物,那么您可以将该格式存储在存储库中,并将其作为构建步骤的一部分进行构建。这将是可区分的,并且仍将提供可用于项目的二进制格式。这与将代码编译成二进制文件或将纯文本编译成 PDF 没有什么不同。

【讨论】:

  • GitHub seems to 使用他们的 linguist 工具作为 gitattributes 替代品;是否有可能使用该工具来区分二进制数据?
  • Linguist 用于检测文件的语言。可以通过各种方式在.gitatrributes 中对其进行配置,但如果不是出于上述原因,这些选项都不能强制将文件呈现为纯文本。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多