【问题标题】:Why does git care about trailing whitespace in my files?为什么 git 关心我文件中的尾随空格?
【发布时间】:2009-10-17 22:42:44
【问题描述】:

无论我使用什么 VCS 来担心我在文件中放入的内容,这有什么关系?我不明白这里有什么意义。是git版本控制还是语法检查?

【问题讨论】:

  • 另请参阅stackoverflow.com/a/30803980/6309,以区分先前提交引入的“旧”空白错误和当前分阶段代码为下一次提交引入的新空白错误。

标签: git whitespace


【解决方案1】:

这是因为 Git 最常见的用途之一是通过电子邮件发送补丁系列。尾随空格会在电子邮件中引起问题,因此通常会被删除,这意味着在通过电子邮件发送补丁并应用它的过程中,任何尾随空格都会丢失。这反过来意味着,如果 repo 中的行中有尾随空格,但在应用的补丁中没有,那么在应用补丁时,您可能会遇到虚假冲突或非预期的额外更改。

这个 pre-commit 钩子过去是默认启用的,但现在不再是。看来我记错了; it was never deliberately enabled by default。正如其他人所指出的,这一直是一个示例预提交挂钩;它曾经通过不给它执行位而被禁用,但这很容易被搞砸(例如,在 Windows 上的 Cygwin 下运行),所以在较新版本的 Git 中(自 over a year ago 起)样本已经通过命名为pre-commit.sample 禁用。如果您不喜欢该行为,您可以删除或移动您的 .git/hooks/pre-commit 以防止执行此挂钩。您还应该将您的 Git 更新到最新版本,因为这已经修复了很长一段时间。

【讨论】:

  • 是的,我认为是这样,但我想确保我在查看 Git 历史并意识到我错了时澄清了这一点。
  • 这是很容易犯的错误,正如手册页所说:The default pre-commit hook, when enabled, catches introduction of lines with trailing whitespaces and aborts the commit when such a line is found. 所以这是默认设置,但未启用默认设置,这更像是一个示例。
  • 哦,我亲爱的主,使用 git 来“通过电子邮件发送补丁”? git 不是关于远程存储库并在它们之间发送更改吗?相反,我会说空白错误通常很糟糕,因为它们使差异看起来很傻。
  • @gyabraham 通过电子邮件发送补丁是许多项目的代码审查方式,例如 Git 最初编写的 Linux 内核。许多开源项目维护者只会从受信任的子项目维护者的存储库中提取,而所有其他补丁都通过电子邮件发送,在应用它们之前可以在其中公开查看和评论。
  • 我正在使用 Samba 将存储库从 Linux 服务器导出到 Mac(说来话长!)。默认情况下,Samba 会在 everything 上设置执行位,这会导致示例预提交挂钩触发。我通过将“hooks”重命名为“sample-hooks”解决了这个问题,因为我没有为这个 repo 使用任何钩子。
【解决方案2】:

Git 根本不在乎。 example pre-commit 钩子会进行空白检查,以演示如何编写钩子,但默认情况下它不启用;您必须使其可执行才能执行任何操作。

【讨论】:

    【解决方案3】:

    为什么?因为尾随空格很容易丢失,导致虚假更改和未应用补丁(因为空格更改)。这是符合编程风格的问题。

    也就是说这是pre-commithook的问题:您可以编辑它,或禁用它,或配置尾随空格(可能仅适用于某些类型的文件)不被视为错误。


    pre-commit 挂钩应该禁用 默认情况下,但用于安装它们的旧版本(1.6.0 之前)已关闭通过关闭可执行权限,这可能不适用于 FAT 等非 UNIX 文件系统;从 1.6.0 开始,它们通过附加“.sample”后缀被关闭(禁用)。

    【讨论】:

    • @apphacker:默认预提交钩子使用的检查是关于通过电子邮件发送补丁,而不是编程风格。
    • +1 为 Bjorn(关于不需要开发人员强制执行他们的风格理念,我在该领域最讨厌的是 GCC)
    【解决方案4】:

    正如 hobbs 所写,示例预提交挂钩可能正在检查尾随空格。要禁用它,请查看 .git/hooks 并确保那里的文件不可执行。

    挂钩可能已启用的一种可能方式是,如果您在 FAT 格式的闪存驱动器上移动您的存储库,则可执行位可能已设置。

    【讨论】:

    • 这就是为什么在较新版本中示例挂钩使用“.sample”后缀而不是没有可执行权限的原因。
    【解决方案5】:

    您可以使用 --no-verify 开关绕过此问题,请参阅http://git-scm.com/docs/githooks

    【讨论】:

      【解决方案6】:

      这不是 VCS 试图告诉你什么是好的编程风格的问题。尾随空格对他们来说是一件坏事,因为尾随空格可以被 VCS 视为无用的修改。

      怎么样?

      想象一下你有这样一行:

      puts "Hello World"^M^M^M
      

      每个“^M”都是一个尾随空格(放在那里是为了简化)。

      另一个开发者不小心把它改成了这样:

      puts "Hello World"^M^M
      

      VCS 会将此视为更改。一个根本不干扰代码的无用的,而是一个变化。这种变化甚至可以被 VCS 指出为冲突(这是应该尽可能避免的事情)。此外,它会不必要地污染您的历史记录。

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        • 2022-11-21
        • 2014-02-20
        • 2016-09-10
        • 1970-01-01
        相关资源
        最近更新 更多