【问题标题】:How do I get small delta files (files changes) using diff?如何使用 diff 获取小的 delta 文件(文件更改)?
【发布时间】:2014-05-12 08:02:25
【问题描述】:

我想生成增量文件,即。包含 2 个文件之间的更改的文件,这些文件的大小很小。

但是,当我使用 -u 格式运行 diff 实用程序来创建统一格式的 diff 文件时,文件太大了。

我有 2 个文本文件,其内容如下所示

1.txt: "hello1234"

2.txt: "hello5678"

运行“diff -u 1.txt 2.txt”时,生成的 diff 文件为 182 字节,如下所示:

--- 1.txt 2014-05-12 03:54:58.000000000 -0400

+++ 2.txt 2014-05-12 03:55:03.000000000 -0400

@@ -1 +1 @@

-hello1234

\文件末尾没有换行符

+hello5678

\文件末尾没有换行符

与只有 9 字节大小的原始文件相比,这是巨大的。

是否有实用程序或其他方法可以生成比源文件小的差异文件(例如 svn/git 实用程序)?

目的是在文件更新时通过网络传输这些增量文件,而不是传输整个文件本身。

【问题讨论】:

  • 如果没有这些数据,patch 将无法正常运行。您要求特定的差异格式,即格式。您能否将远程端指向您的 VCS 并使用其内置方法来拉取更新?压缩文件以进行传输怎么样?要么通过压缩,要么使用具有内置压缩功能(如 SFTP 或 scp)的方法?
  • @nope 挑战问题 - 您提交了两个文件,每个文件包含 9 个字节,其中 4 个不同。您能否提出一种“差异”格式,明确标识原始文件中需要更改的 4 个字节以及需要在不到 9 个字节内更改的内容?如果从“h1e2l3l4o”更改为“h5e6l7l8o”怎么办?

标签: git svn diff


【解决方案1】:

如果您想要“delta”文件,请不要使用差异/补丁,它们并不是真正用于此用途的(特别是diff -u,普通模式更简洁一些) . 您应该使用 xdelta、bsdiff 或类似的东西(即面向二进制)。面向字符的文本差异可能比简单的diff 做得更好。

在某些情况下,没有办法比重复整个文件更有效地表达更改(某些文件包含高密度的更改且位置不可预测)。你的案例就是这样,好消息是典型案例确实比这要好,即使是在数据库或复杂的源代码上。

在某些明显的情况下 delta 不起作用:加密或压缩文件。在这种情况下,应根据解密/解压缩版本计算文件增量。

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 2021-12-21
    • 2012-04-02
    • 2011-01-13
    • 1970-01-01
    • 2014-02-12
    • 2012-11-12
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多