可以将CVS和Subversion设置为忽略合并中的空格吗?

时间:2008-10-10 22:50:03

标签: svn version-control cvs whitespace

CVS和Subversion都有一个方便的合并功能,因此当您更新已修改的源文件时,它会合并其他人在同一文件上所做的更改。

但是,如果您的更改与其他更改不兼容 - 通常如果您同时更改了代码的相同部分 - 则会产生冲突。两段源代码都将包含在合并文件中,您需要手动排序要保留的更改。到目前为止一切都很好。

我的问题是我们中的一些人使用不同的开发环境(Netbeans与vi,如果你必须知道),Netbeans有一个自动缩进功能,可以重新缩进代码。因此,当我们合并更改时,我们有时会遇到巨大的冲突,这些冲突主要是由缩进的简单更改引起的,并不是对代码的真正更改。通常这些会产生数百行明显的冲突,这些冲突必须手动解决,但通常它们只归结为几行真正的变化。当某人的编辑器将unix更改为Windows换行符时,会出现类似的情况,反之亦然。

那么 - 在比较两个版本时,我可以设置合并以忽略这些“冲突”吗? Diff有--ignore-space-change或-b选项,我想在cvs或svn中提供基本相同的功能。我们在不同的项目中使用每个工具,所以我很乐意为其中一个或两个得到答案。

最后两个笔记:

  • 显然,合并过程必须随意选择在合并文件中使用哪个版本的空白。我很好 - 我们以后可以再次重新格式化。
  • 我可以通过更多的纪律和更频繁的检查来避免这一点 - 承认和理解。但我并不完美。

3 个答案:

答案 0 :(得分:11)

对于SVN:在命令行工具中,有 -x 选项,您可以将其设置为“ b ”或“ w ”忽略空间变化。所有空间。
您还可以提供第三方工具来进行合并。因此,如果您有一个忽略空格的合并,您可以使用这个。 TortoiseSVN一如既往地是所有参数的前端,因此它也支持忽略空格。

描述了here svn merge命令。您需要的选项是 - diff3-cmd

答案 1 :(得分:5)

对于Windows用户,您可以使用TortoiseSVN附带的merge features(Subversion的Windows资源管理器外壳扩展)来支持您所描述的内容:

  

忽略行结尾不包括更改   这完全是由于差异造成的   线端风格。

     

比较空白包括所有   缩进和内联的变化   将空格添加/删除。

     

忽略空格更改排除   仅因a而发生的变化   变化的数量或类型   空白,例如。改变了   缩进或更改标签   空间。在那里添加空格   之前没有,或删除   空白完全仍然显示   作为改变。

     

忽略所有空格排除所有空格   只有空白的变化。

答案 2 :(得分: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();
    }
}