如何在使用 svn 生成差异时忽略编码约定/样式?
Posted
技术标签:
【中文标题】如何在使用 svn 生成差异时忽略编码约定/样式?【英文标题】:How to ignore coding convention/style while generating diff using svn? 【发布时间】:2011-07-14 20:06:48 【问题描述】:我们如何在使用 svn 生成差异时忽略编码约定?
详细来说,我不想区分以下两种编码风格
while (variableIter.hasNext())
lModel = variableIter.next();
与
while (variableIter.hasNext())
lModel = variableIter
.next();
如果我运行 svn diff,我会得到以下 diff:
- while (variableIter.hasNext())
-
- lModel = variableIter.next();
+ while (variableIter.hasNext())
+ lModel = variableIter
+ .next();
但我不希望这成为差异的一部分。我希望 svn 忽略这种编码风格的差异。那么,svn 中是否有任何选项可以帮助我做到这一点? 要么 是否有脚本或我可以在 svn 生成的 diff 上运行以仅吐出 real 更改而不是编码样式更改的脚本?
TIA
【问题讨论】:
Semantic Diff Utilities 的可能重复项 【参考方案1】:我无法帮助 subversion 直接产生差异。
但是,一旦您意识到您看到的差异与格式相关,那么您可能会转向替代方案 差异化工具。请参阅我们的Smart Differencer 工具。这些工具是特定于语言的。它们通过解析语言并构建抽象语法树,然后比较这些树来工作。这使它们完全不区分空格(和注释);重新格式化代码不会显示为差异。差异被报告为语言元素(操作数、表达式、语句、声明、块、方法、类……)和编辑操作(移动、删除、插入、复制、在块内重命名变量,并且精确到开头行/列和结束行/列。
我们目前拥有适用于多种语言的 SmartDifferencers,包括 C、C++、C#、Java、javascript、php。
【讨论】:
【参考方案2】:我不知道 svn 是否有内置函数可以做到这一点。无论如何,您可以使用一些工具在提交之前统一缩进您的代码,例如 C 的缩进工具 (http://www.gnu.org/software/indent/)。
或者您可以尝试使用此选项启动差异:
svn diff -x -w
【讨论】:
问题是我签出的代码格式很差,我使用 eclipse 正确格式化了它。现在我需要发送 diff 以进行代码审查,并且我无法发送具有这些编码风格差异的整个 diff,因为它会运行到几千行。我只想发送与我所做的代码中的实际更改相对应的差异。希望这能解释我现在面临的确切问题。 @texens:尝试检查 svn diff -x -w。它应该忽略空格和结束线。 @texens - 我明白,我的建议为时已晚,但绝不要将重构和重新格式化与其他任何东西混合在一次提交中。此外,您使用 Eclipse 自动格式化工具更改的“格式不正确”的代码可能带有您已破坏的附加语义。是的,采用以前的修订版,仅应用格式,提交,然后应用您的更改并再次提交。不要破解 Subversion :) @0verbose:是的,这是我尝试的第一件事。我也试过-x --ignore-eol-style。但不幸的是,他们似乎都没有做我想做的事。这可能是因为 svn diff 逐行比较字符。当字符从一行移动到另一行时(当前问题就是这种情况),几乎没有任何方法可以忽略它。也许,我们需要一个脚本或第三方应用程序来完成上述工作,因为由于其设计的限制,我无法看到 svn diff 如何完成这项工作。 @bobah:是的,我已经意识到这一点,很难:|我有一个 9000 行长的 diff 文件,我将不得不遍历整个 diff 文件并手动删除由于编码风格的不同而由 svn diff 生成的不需要的差异:(以上是关于如何在使用 svn 生成差异时忽略编码约定/样式?的主要内容,如果未能解决你的问题,请参考以下文章