【问题标题】:How to force git to treat text file that contains NUL as text?如何强制 git 将包含 NUL 的文本文件视为文本?
【发布时间】:2019-08-10 10:50:18
【问题描述】:

我将文本文件用作一种非常简单的数据库,它只包含 NUL 分隔的字符串。我想通过 git 来管理这些文件,作为文本。

这是一个示例文件(^@ 表示 NUL):

Tlrl-ng tl tlu
^@aget does not wait for all forked processed. Probably unsolable unless we invoke zsh -c
^@webhook siri
^@login as peter

如果这是不可能的,那么我应该使用什么字符来代替 NUL?记录可以是多行的。

请注意,我需要git-merge 才能将这些文件视为普通文本。我使用 gitattribute * merge=union diff text.

【问题讨论】:

  • text 添加到文件的 gitattributes 条目中,Git 会将文件提供给 diff 并尝试显示它。请注意,NUL 可能无法很好地显示,并且可能会混淆其他面向文本的程序。如果我需要包含所有字节的多行记录,我可能只是以某种方式对整个文件进行编码,而不是将原始字节放入文件中......
  • @torek 喜欢“*文本”吗?
  • 你可以这样做。但是在一行中列出所有属性会更有效:例如,* text merge=union。值得考虑:联合合并是一个非常愚蠢的合并算法,所以你应该小心使用它。
  • @torek 没用。 warning: Cannot merge binary files: attic/.attic_todo ((null) vs. (null)) Auto-merging attic/.attic_todo.
  • 有趣:联合合并不允许 NUL 字节有点令人惊讶。这也许并不完全令人惊讶,尤其是如果它是用 C 语言编写并使用 NUL 终止的字符串时。不过,对文件进行编码将解决所有问题。

标签: git text git-merge utf nul


【解决方案1】:

如果这是不可能的,那么我应该使用什么字符来代替 NUL?记录可以是多行的。

最好的方法可能是COBS-将您的数据编码为单个数据包,您可以将所有长度添加 11(并将字节填充开销增加一小部分)以避免双关语长度加换行符。

【讨论】:

  • 鉴于他想联合合并文件,加上联合合并不喜欢 NUL 字节的观察,我建议使用其他编码。它可能应该重新编码换行符。
  • @torek COBS 消除了输出编码中的空值; “作为单个数据包”意味着文件中根本没有空值,尾随 0 的存在是隐含的,就像浮点值中的前导 1。如何避免长度字节中的换行符是任意的,添加 11,跳过 10,等等。
  • 哦,对了,出于某种原因,我认为 NUL 也在他的数据中。
猜你喜欢
  • 2021-01-04
  • 2011-10-14
  • 2016-07-12
  • 1970-01-01
  • 2017-12-30
相关资源
最近更新 更多