我如何区分和修补/合并字符串而不是文件?

时间:2012-05-04 15:20:27

标签: python mysql django git bash

我正在开展一个项目,人们可以提交故事并让其他人参与其中。我想存储人们所做的更改而不是整个新的更改集,而不是简单地编辑数据库中的条目。然后,如果人们想要恢复到以前的版本,我可以动态应用差异。我还可以轻松地向编辑者提供仅包含修改过的文本的用户,以便他们可以直接跳转到更改。

我知道如何使用diff文件并使用它们修补其他文件。但我正在使用Python和Django创建一个Web应用程序,我将把所有这些差异存储在MySQL数据库中。鉴于性能不是此应用程序的主要问题,我准备从数据库中提取数据,生成文件,并在这些文件上运行git diffpatch

有没有比构建新文件更好的方法,每次我想创建新版本或应用新差异时删除它们?有没有办法在直文而不是文件上运行差异?例如。将bash中的变量设置为(将会是什么)文件的内容(但实际上是来自数据库的数据),并在它们上运行git diff?我希望在用户提交表单后从Python文件中控制这些操作。

我真的只是想找到一个好方法来开始解决这个问题,所以任何帮助都会非常感激。

感谢您的时间,

ParagonRG

2 个答案:

答案 0 :(得分:5)

我已经做了很多寻找解决方案。 Python's difflib是相当合法的,但不幸的是,它往往要求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时)。你可以创建一些diff并立即应用它们(即快速通过历史记录或追踪){{1功能。

要反转到历史记录,只需确保在调用diff_apply_bulk()reverse时将diff_bulk()属性设置为True。例如:

diff_apply_bulk

如果从text1开始并使用diff1和diff2生成text2和text3,则使用上面的代码行重建text1。请注意,差异列表仍按升序排列。 '合并',即。将diff应用于字符串本身就是一个字符串。

所有这些都允许我将差异存储在数据库中作为简单的VARCHAR(或者你有什么)。只要我有一个起点,我就可以按顺序将它们拉出来并将它们应用于任一方向以生成我想要的文本。

请随意留下任何评论,因为这是我的第一个Python模块。

谢谢,

ParagonRG

答案 1 :(得分:1)

看看libgit。它是一个C(和所有其他语言)接口,允许您以各种方式操作git存储库。

它看起来很低级,所以让它实际提交,差异等等可能会很乏味,但它至少对add a blob to the repo without it needing to be on disk有一个功能。

另一种选择当然是创建一个普通的基于文件的存储库,并使用os.system调用在数据库和文件系统之间来回复制和反弹。