我已经做了很多寻找解决方案的工作。Python 的 difflib是相当合法的,但不幸的是,它倾向于要求 diff 字符串包含整个原始字符串以及更改的记录。这与 git diff 不同,在 git diff 中您只能看到更改的内容和一些额外的上下文。difflib 还提供了一个名为unified_diff 的函数,它确实提供了一个更短的diff,但它没有提供从一个字符串和一个diff 重建字符串的函数。例如。如果我从 text1 和 text2 中创建了一个差异,称为 diff1,那么我无法从 text1 和 diff1 中生成 text2。
因此,我制作了一个简单的 Python 模块,它允许从单个字符串及其相关差异中向前和向后重建字符串。它称为 merge_in_memory,可以在https://github.com/danielmoniz/merge_in_memory找到。只需拉动存储库并运行 setup.py。
一个简单的用法示例:
import merge_in_memory as mim_module
str1 = """line 1
line 2"""
str2 = """line 1
line 2 changed"""
merger = mim_module.Merger()
print merger.diff_make(str1, str2)
这将输出:
---
+++
@@ -1,2 +1,2 @@
line 1
-line 2
+line 2 changed
diffs 只是字符串(而不是 tan 生成器,因为它们在使用 difflib 时)。您可以使用该函数创建多个 diffs 并一次应用它们(即快进历史或回溯)diff_apply_bulk()
。
要反转到历史记录,只需确保在调用或reverse
时将属性设置为 True 。例如:diff_bulk()
diff_apply_bulk
merge = self.inline_merge.diff_apply_bulk(text3, [diff1, diff2], reverse=True)
如果您从 text1 开始并使用 diff1 和 diff2 生成 text2 和 text3,则使用上面的代码行重建 text1。请注意,差异列表仍按升序排列。“合并”,即。将差异应用于字符串本身就是一个字符串。
所有这些都允许我将差异存储在数据库中作为简单的 VARCHAR(或你有什么)。只要我有一个起点,我就可以将它们按顺序拉出并在任一方向应用以生成我想要的文本。
请随时对此发表评论,因为这是我的第一个 Python 模块。
谢谢,
典范RG