【问题标题】:How do you check if two commits differ only in code formatting您如何检查两个提交是否仅在代码格式上有所不同
【发布时间】:2020-02-01 01:34:48
【问题描述】:

我试图将 java checkstyle 添加到一个 Hugh 项目中并得到了 7000 个错误,我认为 formatting 整个项目将摆脱 5000 个错误。

问题是我的团队拒绝审查这个提交(在 git 上),因为它是一个巨大的变化。有没有一种方法/脚本可以轻松确定两个提交是否仅在代码格式上有所不同并且没有逻辑差异。

【问题讨论】:

  • 似乎太难尝试了。只是回滚那个。我想知道为什么团队拒绝...
  • 使用相同的格式化程序格式化前后(我会使用google-java-format,但其他工具显然可用),然后只是区分它们。
  • 您还可以使用eslint 设置编码标准。此外,您可以在创建 PR 时设置构建检查,这样如果有人忘记 lint 代码,构建就会失败。这样,您将只有编码错误。虽然缩进和其他与语法相关的次要编码约定保持不变。
  • eslint 也可用于轻松修复所有这些代码格式错误。
  • 最好让 git diff 和 code-diff 产品能够智能地感知/忽略代码风格差异,并呈现用户偏好风格的差异

标签: java git github version-control checkstyle


【解决方案1】:

您可以先使用一些options 检查差异以减少一些差异,例如

git diff --ignore-all-space --allow-indentation-change --ignore-blank-lines HEAD^

它不会忽略更复杂的重构,但有争议的是,大部分样式更改只会影响空格和缩进。

【讨论】:

    【解决方案2】:

    解决方案 1

    将一个修订签出到一个目录,另一个修订签入另一个目录。对两个目录应用相同的格式。无论您应用什么特定格式,这两个目录都应该是一样的。

    然后使用您选择的差异工具比较目录,例如 Meld、WinMerge、Diffinity。如果它们没有区别,那么实际上两个修订版除了格式之外没有区别。

    解决方案 2

    更简单的方法是不比较修订,而只是格式化代码:还原提交,检查“基线”修订,格式化代码,提交。然后您将确定除了格式之外没有任何更改。

    【讨论】:

      【解决方案3】:

      一种解决方案是比较构建结果(即编译您的项目并构建 JAR 或 WAR 或其他工件)。如果您只更改格式,则生成的字节码将等于前一个。因此,一个简单的逐位比较将告诉您格式更改是否没有破坏任何功能。

      另一种解决方案是只使用您拥有的任何自动化测试并运行它们。尽管我根据您团队的反应假设您没有广泛的测试覆盖范围。

      【讨论】:

      • 比较构建结果可以得到不同的结果。 JAR 中的类文件将具有不同的时间戳,因此会有所不同。包含 JAR 的 WAR 也会有所不同。
      • 有些工具可以忽略时间戳,只看内容(即字节码)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2015-08-10
      • 2011-01-04
      • 2013-06-15
      相关资源
      最近更新 更多