CVS和Subversion是否可以设置忽略空格合并?

21

CVS和Subversion都有一个方便的合并功能,当您更新修改过的源文件时,它会将其他人对同一文件所做的更改合并到其中。

然而,如果您的更改和其他人所做的更改不兼容 - 通常是因为您都更改了代码的相同部分 - 它将创建一个冲突。两个源代码段将包含在合并的文件中,您需要手动整理哪些更改要保留。到目前为止都还好。

我的问题是,我们中有些人使用不同的开发环境(Netbeans与vi),而Netbeans具有自动缩进功能,可以重新缩进代码。因此,当我们合并更改时,有时会出现巨大的冲突,这主要是由缩进中的简单更改引起的,并非真正的代码更改。通常情况下,它们会创建数百行表面上的冲突,必须手动解决,但通常它们只涉及几行真正的更改。当某人的编辑器将Unix更改为Windows换行符或反之亦然时,也会出现类似的情况。

因此,我是否可以设置合并以忽略比较两个版本时出现的这些“冲突”?Diff具有--ignore-space-change或-b选项,我希望在cvs或svn中也有基本相同的功能可用。我们在不同的项目上使用每个工具,因此我将很高兴获得其中任何一个的答案。

最后两点:

  • 显然,合并过程必须对要在合并文件中使用的空格版本做出任意选择。我没有问题 - 我们以后总是可以重新格式化它。
  • 我可以通过更加严格地检查更改来避免其中一些 - 已知并理解。但我不完美。
3个回答

11

对于SVN:在命令行工具中,有一个选项-x,你可以设置为"b"或"w"分别忽略空格的改变或所有空格的改变。你也可以提供第三方工具来进行合并。所以如果你有一个忽略空格的合并工具,你可以使用它。

TortoiseSVN作为前端支持所有参数,因此它也支持忽略空格。

这里描述了svn merge命令。你需要的选项是--diff3-cmd


好的,谢谢。接下来的问题是:有人知道一个可以忽略空格的合并工具吗?在另一个问题中,我发现了一些看起来不错的可视化合并工具(meld、tortoisesvn),但有没有人知道一个命令行的工具呢? - Leigh Caldwell
你可以查看WinMerge(http://www.winmerge.org/)。它是开源的,你可以轻松地在TortoiseSVN中使用它作为差异/合并查看器。 - Peter Parker
我一直在Linux上研究这个问题,似乎没有简单的方法来解决。例如,你可以告诉它使用“diff3”,但它没有忽略空格的参数。但是你可以传递一个参数来使用不同的“diff”程序。所以,你让它调用“diff -b”。但是从SVN命令(即svn(使用diff3(使用(diff -b))))中无法递归执行此操作(显然)。下一个我要研究的解决方案是创建一个shell脚本,使用“diff”忽略空格来调用“diff3”。然后我会让SVN使用这个shell脚本。 - UncaAlby
1
更新:这个策略似乎进入了一个无限递归循环。或者可能是我没有等待足够长的时间。 - UncaAlby

5
对于Windows用户,您可以使用TortoiseSVN(Subversion的Windows资源管理器shell扩展程序),它带有支持您所描述的合并功能

忽略行尾排版:排除仅由于行尾样式差异引起的更改。

比较空格:包括所有缩进和内联空格的更改作为添加/删除行。

忽略空格更改:排除仅由于空格数量或类型的更改而导致的更改,例如更改缩进或将制表符更改为空格。在以前没有空格的地方添加空格或完全删除空格仍会显示为更改。

忽略所有空格:排除所有仅包含空格的更改。


0

TortoiseMerge没有任何CLA(命令行参数)来忽略空格和忽略大小写。经过大量搜索,似乎可以通过调整注册表值来实现。

/* DisableWhitespaceDifferences and DisableCaseDifferences. 
* The settings for TortoiseMerge is stored in Registry in CurrentUser\Software\TortoiseMerge\
* DWORDS stored the property values.
* 
* IgnoreWS         :   Set to 1 to ignore the whitespace differences. 
*                      Set to 0 to allow the whitespace differences.             
* IgnoreEOL        :   Set to 1 to ignore the End of Line differences. 
*                      Set to 0 to allow the End of Line differences.             
* CaseInsensitive  :   Set to 1 to ignore the Case differences. 
*                      Set to 0 to allow the Case differences.             
*/

// Get the key from the registry
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\TortoiseMerge", true))
{
   if (key != null)
   {
        // Set the IgnoreWS and IgnoreEOL DWORDs based on DisableWhitespaceDifferences is set or not
        key.SetValue("IgnoreWS", DisableWhitespaceDifferences ? 1 : 0, RegistryValueKind.DWord);
        key.SetValue("IgnoreEOL", DisableWhitespaceDifferences ? 1 : 0, RegistryValueKind.DWord);

        // Set the CaseInsensitive DWORD based on DisableCaseDifferences is set or not
        key.SetValue("CaseInsensitive", DisableCaseDifferences ? 1 : 0, RegistryValueKind.DWord);

        // close key
        key.Close();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接