用于协作的版本控制(带有单词级差异)?


20

现在,大多数论文都是协作编写的,而协作者通常位于不同的地方。我一直在文档和代码中使用版本控制系统,并且发现版本控制对于协作软件项目至关重要,但是从理论上讲,似乎许多研究人员都避免将其用于撰写联合论文。为了说服我的合作者,版本控制(修订控制)是一起工作的一个好主意,似乎有一些先决条件。 不可能强迫所有人担心换行符和段落的特定约定集,或者避免制表符/空格转换。

有人提供免费托管的小型共享文档存储库,并且具有可处理单词级差异(不是基于行)的文本文档友好版本控制吗?

如果没有,那么我将欢迎基于经验的其他建议(请避免猜测)。

我想到的是Git,Subversion,Mercurial,darcs或Bazaar,它们被设置为使用wdiff处理字级差异,以及一种设置公用密钥(例如,通过ssh)保护访问的简单方法。但是,我看过的版本控制提供程序似乎都没有提供这样的功能。对于科学合作,许多公司强调的“企业”功能不是很重要(分支机构,与trac集成,第三方审核,分层项目团队)。但是单词级差异似乎很关键,但却不受支持。以我的经验,使用文本文件的行级差异,每个人都必须避免重新格式化将选项卡更改为空格的段落和编辑器,反之亦然,这会导致问题;似乎还有许多虚假的编辑冲突。

请参阅MO上有关协作工具的相关问题,以及TeX.SE上有关LaTeX文档的版本控制LaTeX软件包的版本控制的相关问题。另请参见SVN主机比较比较图表,以获取大量的主机提供程序列表,仅是主要版本控制系统之一。


编辑: Jukka Suomela对TeX.SE问题“ 最佳的可识别LaTeX的差异化和合并工具以进行颠覆 ” 的回答似乎是迄今为止最好的建议,涵盖了如何在字级上解释增量。此外,Jukka还解释了存储库端上连续版本之间的差异如何与用于冲突检测和更改合并的用户级别差异分开。Jukka在TeX.SE上的答案明确地排除了同时进行的编辑和合并,而是依靠传统的原子编辑令牌来避免编辑冲突。澄清(并修改)我的原始问题,是否有一种方法可以确保可以在单词差异的基础上而不是在行差异的基础上解决编辑冲突?换句话说,可以wdiff还是将类似的工具集成到版本控制工具的冲突检测部分中,以类似的方式可以忽略行尾差异和空格差异?


3
我不太明白这个问题。例如,在SVN中,显示给用户的差异是由客户端生成的,是否获得基于单词的差异或基于行的差异取决于SVN客户端(及其配置)。托管您的SVN信息库的公司完全不会对此产生影响。
Jukka Suomela

2
@suresh如果您正在编辑(编写)文本文档,则必须在diff中扫描整行才能看到有人更改了一个逗号,这通常很麻烦。正确的行为通常是显示更改的最小单位。或者,如果有人不使用换行符,请考虑该行为。然后,更改单个单词将使整个段落显示在差异中,以供您查找微小的更改。
Mark Reitblatt,2010年

2
我不使用强行换行符来换行。在我的Latex源代码中,物理文本行通常是完整的文本段落。编辑器可以对其进行自动换行以进行显示,具体取决于当前窗口的宽度。它大大简化了工作;无需担心诸如重新包装段落或与您的共同作者同意“正确”的行宽之类的事情。但是,您将需要一个字级差异工具来快速查看更改。
Jukka Suomela

2
@Andras我的观点是,VC系统仅需要能够在客户端上重构两个修订版,并不奇怪,所有VC系统都可以做到这一点。然后,您需要一个词级三路合并实用程序,但我什么都不知道。(例如,TortoiseMerge和kdiff3都是基于行的。)一旦有了这样的实用程序,任何允许您指定外部合并实用程序的VC系统就足够了。(其中包括svn,bzr,git,hg等)
Maverick Woo 2010年

3
造成混淆的一个原因是,SVN在服务器和客户端之间的通信中使用了内置的二进制diff算法(在单个字节的级别上运行),服务器内部也使用该算法来保持存储库紧凑。这仅仅是一种优化;它对用户不可见,并且相同的二进制diff算法可以应用于任何类型的文件。所有用户可见的内容(人类可读的差异,合并,冲突解决...)都在客户端发生。
Jukka Suomela

Answers:


11

我已经使用git来协作一些用乳胶编写的文档。您必须遵守一些规则:

  • 在新行上开始每个句子,只要没有空行,latex就会忽略这些新行
  • 使用相同的配置进行格式设置(选项卡/空格/最大文本宽度)
  • 为了获得最佳结果,请在您的存储库中创建一个.gitattributes文件,并添加line *.tex diff=tex。这使得diff了解tex语法并导致更有意义的输出。

然后,您可以使用git diff --color-wordsgitk --color-words看字的差异(见本文字的字diff文件Git中如何配置GIT中经常使用的文字差异算法显示git的差异/ git的日志)。

为了减少手动合并,我建议为节和小节使用单独的文件(取决于文档的大小)。


我将考虑对自己的文档执行此操作,这似乎是实现我的大多数目标的简便方法。但并非所有人都热衷于这种方式工作...
安德拉斯·萨拉蒙

2
对于犹豫不决的人们,如果他们不喜欢git命令行,可以使用TortoiseGit。如果是关于新行部分的每个句子,并且只要不强制使用最大文本宽度,那么这并不是很重要。(我曾从事一些没有该规则的项目)
Davy Landman 2010年

总的来说,我同意git是一个不错的选择。但是,为什么可以为(子)节使用单独的文件来减少手动合并的次数?我还想知道从新行开始的每个句子有什么帮助(有时句子在编辑过程中会混合在一起)。
2013年

关于分隔文件:当时,我不了解git合并的确切细节,因此实际上并不需要,但是出于其他原因,还是建议这样做。换行上的句子非常重要,因为git周围的大多数工具总是显示换行,如果您随后使用另一种策略,例如让编辑器进行换行,则每当有人在段落中更改1个单词时,您都必须搜寻它发生了,并且在自动合并的情况下:没办法。
戴维·兰德曼


4

我真的很想回应别人,建议您坐下来制定一个不错的SVN策略。我使用SVN托管我的整个“研究”结构:

  • JabRef参考管理
  • 下载的PDF文件
  • 文章

很棒,因为它包含了所有内容,并且当然提供了历史记录。需要注意的是您需要自己的服务器。但是,如果您有一些现有的Windows计算机(或任何您愿意使用的计算机),则可以简单地通过VisualSVN Server安装它。然后,您可以为协作者创建适当的帐户,并为他们提供访问适当区域的权限(即,可能具有对JabRef bibtex文件的读取权限,并且可以对共享的“进行中”文章区域进行读/写操作)。

TortiseSVN可用作与SVN交互的Windows客户端。您需要小心移动/删除文件和复制文件夹(SVN会将元数据存储在每个文件夹的隐藏文件夹内,因此您必须从SVN内部执行delete命令来摆脱它,这需要一点时间来使用,但值得投资)。

然后,当与合作者一起工作时,他们显然还必须使用SVN。但是,同样,在学习上的投入也不是毫无价值的。并且经过某种思考,您也可以拥有它,因此您可以只读访问其jabref文件(可能通过svn中的'external'工具)。

这样,您只需花一点点思索和一点点努力,便可以正常地编辑文档,每晚进行更改,早上进行更新并轻松解决所有冲突。

我真的推荐它。设置自己的SVN的人越多越好,因为这只会在将来改善协作选项(尽管,当然,如果可能存在建立科学知识库的“标准”方法,那将是有益的)。

-编辑:实际上,我在这里写下了这样的建议:与LaTeX和SVN的科学协作策略。它建议利用svn 外部功能来允许具有类似设置的人之间轻松协作。让我知道它是否需要更改或根本不合适。


4

在阅读您的精彩文章并亲自寻找解决方案时,我偶然发现了在gitk中以单词级别对更改进行着色的选项。gitk参数似乎是一个新的和/或未记录的功能,因为自动完成功能不提供该功能,并且gitk手册页未列出该功能。
这是我找到的选项:

gitk --word-diff=plain
gitk --word-diff=porcelain
gitk --word-diff=color

您可以在搜索“ diff --color-words” gitk的该主题中找到一些讨论。

编辑:
这是什么样子...

使用gitk在单词级别上着色的差异


1

我非常了解这个问题。我已经开始使用万花筒与git进行比较。它仅适用于Mac,但其比较比wdiff更好,并且还具有界面和实时更新。


2
在我看来,万花筒只是一种基于行的差异工具,此外,它还可以突出显示每行内部的变化。它不能替代wdiff和朋友。万花筒会产生难以理解的差异,例如,您只需要一段文本并更改一些换行符。基于Wdiff的工具仅忽略换行符的更改。
Jukka Suomela
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.