【问题标题】:Code formatting and source control diffs代码格式和源代码控制差异
【发布时间】:2010-10-28 14:51:56
【问题描述】:

在计算签入版本之间的差异时,哪些源代码控制产品具有忽略空格、大括号等的“差异”功能?我似乎记得 Clearcase 的 diff 做到了这一点,但 Visual SourceSafe(或至少我使用的版本)没有。

我问的原因可能很典型。团队中四个完全合理的开发人员有四种完全不同的方式来格式化他们的代码。在检查出其他人上次更改的代码后,每个人都会立即运行某种程序或编辑器宏来按照自己喜欢的方式格式化。他们进行实际的代码更改。他们签入他们的更改。他们去度假。两天后,这个已经运行了两年的程序崩溃了。分配给这个 bug 的开发人员做了版本之间的 diff,发现了 204 个差异,其中只有 3 个是有意义的,因为 diff 算法很蹩脚。

是的,您可以制定编码标准。大多数人都觉得它们很可怕。每个人都可以吃蛋糕的解决方案似乎更可取。

=========

编辑:感谢大家提出的一些很好的建议。

我从中得到的是:

(1) 最好使用带有插件类型差异的源代码控制系统。

(2) 找到具有合适选项的差异。

(3) 使用良好的源格式化程序并确定签入标准。

听起来像是一个计划。再次感谢。

【问题讨论】:

  • Clearcase 确实可以选择忽略空白差异。

标签: version-control


【解决方案1】:

选择一个(可怕的)编码标准,把它写在一些官方的编码标准文档中,然后继续你的生活,搞乱空白不是生产性工作。

请记住,您是一名专业的开发人员,完成项目是您的工作,因为个人风格偏好而更改代码中的任何内容都会损害项目 - 它不仅会使 diff-ing 变得更加困难,还会引入困难如果您的源格式化程序或编译器有错误(当两个同事开始争吵时,您花哨的差异工具将无法拯救您)发现问题。

如果有人只是不同意使用选定的风格,请提醒他(或她)他是作为一种职业而不是爱好编程,请参阅http://www.ericsink.com/entries/No_Great_Hackers.html

【讨论】:

    【解决方案2】:

    正如Is it possible for git-merge to ignore line-ending differences? 中所解释的,将正确的差异工具与您最喜欢的 VCS 相关联更重要,而不是依赖正确的 VCS 选项(即使 Git 确实有一些关于空格的选项,就像提到的那个在Alan's answer 中,它永远不会像人们希望的那样完整)。

    DiffMerge 在这些“忽略”选项上更完整,因为它不仅可以忽略空格,还可以忽略基于给定文件中使用的编程语言的其他“变体”。

    【讨论】:

      【解决方案3】:

      Beyond Compare 可以做到这一点(以及更多),您可以将它集成到 Subversion 或 Sourcesafe 中作为外部差异工具。

      【讨论】:

        【解决方案4】:

        Git 确实有这些选项:

        • --ignore-space-at-eol

          在 EOL 时忽略空格的变化。

        • -b, --ignore-space-change

          忽略空格数量的变化。这将忽略行尾的空格,并考虑一个或多个的所有其他序列 空白字符是等价的。

        • -w, --ignore-all-space

          比较行时忽略空格。即使一行在另一行有空格的地方有空格,这也会忽略差异 没有。

        我不确定是否可以使用 Git 的 diff 忽略大括号更改。

        如果是 C/C++ 代码,您可以定义Astyle 规则,然后使用Astyle 将源代码的大括号样式转换为您想要的样式。然后git diff 将产生正常的输出。

        【讨论】:

          【解决方案5】:

          也许您应该选择一种格式并在签入之前运行一些缩进工具,以便每个人都可以签出,根据自己的喜好重新格式化,进行更改,重新格式化回官方标准,然后签入?

          几个额外的步骤,但他们在工作时已经使用了缩进工具。也许它可以是一个触发的签到脚本?

          编辑:这也许也可以解决大括号问题。

          (我自己没有尝试过这个解决方案,因此是“也许”和“也许”,但我参与过有同样问题的项目,尝试通过数百个不相关的更改进行差异是很痛苦的不仅限于空格,还包括格式本身。)

          【讨论】:

          【解决方案6】:

          Subversion 显然支持这一点,无论是在最新版本中本机,还是通过使用 Gnu Diff 等替代差异。

          【讨论】:

            猜你喜欢
            • 2017-10-10
            • 1970-01-01
            • 2021-08-01
            • 2012-07-21
            • 2012-01-20
            • 1970-01-01
            • 2012-07-25
            • 2012-03-24
            • 2011-12-17
            相关资源
            最近更新 更多