这一直在我心中徘徊,所以我想我也可以继续问。
wiki如何处理相同内容的多个编辑?
这是我要问的简单例子。假设页面包含以下内容:
我是一个页面!
现在让我们说两个人去编辑那个页面。每个人都添加一句话:
第一人:
我是一个页面!
我是同一页的第二句话!
第二个人:
我是一个页面!
我是第二句话了!
想象一下,每个人的第二句话是关于每个人想要添加的页面主题的同样相关但不同的事实。
现在让我们说第一个人在第二个人之前提交他们的更改,但是第二个人甚至没有机会看到那个人所做的更改。当他最终提交时,第二人的变化会覆盖第一人的变化吗?
是否有可用于此的差异/合并算法?
答案 0 :(得分:8)
我相信维基百科使用a fairly simple diff/merge算法,类似于大多数源代码控制软件的做法。
在您给出的示例中,它会引发合并冲突错误,因为它无法知道最终标记中应该首先出现哪一行。保存更改的第二个人将看到合并错误页面,他们必须选择如何解决冲突。
但请记住,维基百科是并发用户规模的高端产品。对于大多数wiki来说,使用一个非常简单的“最后保存胜利”算法可能是可以接受的,其中第二人的编辑只是覆盖了第一个人的。随着历史的增加,第一个人应该很容易发现他们的更改已被覆盖并再次添加。
我相信这个解决方案就是Stack Overflow所使用的。 SO还有一个额外的功能,即Ajax调用用于通知编辑器是否有其他人进来并在页面完成之前修改页面。
答案 1 :(得分:2)
这取决于维基的味道。有许多几十或几百个维基克隆。通常,第二个用户将收到“此页面已被其他用户编辑”错误消息,然后他们必须重新加载页面并重做其编辑。
维基当然可以将两个编辑合并在一起,就像Subversion这样的版本控制系统一样。如果您熟悉UNIX patch
命令,则会涉及区分用户2的编辑并生成随后应用的补丁。补丁可能成功也可能不成功;在你的例子中会出现合并冲突,所以它会回到原来的“这个页面已被其他用户编辑,你输了”错误信息。
答案 2 :(得分:1)
可能存在一种使用锁定来防止文件被编辑两次的事务机制。请参阅维基百科上的file locking。
答案 3 :(得分:1)
wiki如何处理多个同步编辑?
这取决于wiki的实现。
是否有可用于此的差异/合并算法?
任何符合您要求的合并算法都可以。
一般来说,这取决于您喜欢wiki的行为。例如,您可以选择以这样的方式实现您的wiki:在文章被修改且Person Two正在处理过时的基本副本时,不会提交Person Two的更改。如果他/她知道这些变化,潜在的第二人会输入完全不同的东西。在这种情况下,您可以选择不允许提交第二人的更改。这可以通过交易机制Kurt Du Bois在他的回答中提到来实现。
另一个选择是实现一种始终允许保存wiki文章的方法。在这种情况下,您可能会丢失第一个人的更改,而在第一个方法中,您将丢失第二个人的更改。
第三种方法是在合并窗口中并排显示两篇文章。我不知道支持这个的维基。如果确实如此,我想知道如果三个(或更多)人同时修改同一个文件会发生什么。
因此,如果您使用的是wiki,我建议保持较小的编辑。
如果您正在实施维基,您可以选择希望维基系统的行为。