【发布时间】:2009-10-17 22:42:44
【问题描述】:
无论我使用什么 VCS 来担心我在文件中放入的内容,这有什么关系?我不明白这里有什么意义。是git版本控制还是语法检查?
【问题讨论】:
-
另请参阅stackoverflow.com/a/30803980/6309,以区分先前提交引入的“旧”空白错误和当前分阶段代码为下一次提交引入的新空白错误。
标签: git whitespace
无论我使用什么 VCS 来担心我在文件中放入的内容,这有什么关系?我不明白这里有什么意义。是git版本控制还是语法检查?
【问题讨论】:
标签: git whitespace
这是因为 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 更新到最新版本,因为这已经修复了很长一段时间。
【讨论】:
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 根本不在乎。 example pre-commit 钩子会进行空白检查,以演示如何编写钩子,但默认情况下它不启用;您必须使其可执行才能执行任何操作。
【讨论】:
为什么?因为尾随空格很容易丢失,导致虚假更改和未应用补丁(因为空格更改)。这是符合编程风格的问题。
也就是说这是pre-commithook的问题:您可以编辑它,或禁用它,或配置尾随空格(可能仅适用于某些类型的文件)不被视为错误。
pre-commit 挂钩应该禁用 默认情况下,但用于安装它们的旧版本(1.6.0 之前)已关闭通过关闭可执行权限,这可能不适用于 FAT 等非 UNIX 文件系统;从 1.6.0 开始,它们通过附加“.sample”后缀被关闭(禁用)。
【讨论】:
正如 hobbs 所写,示例预提交挂钩可能正在检查尾随空格。要禁用它,请查看 .git/hooks 并确保那里的文件不可执行。
挂钩可能已启用的一种可能方式是,如果您在 FAT 格式的闪存驱动器上移动您的存储库,则可执行位可能已设置。
【讨论】:
您可以使用 --no-verify 开关绕过此问题,请参阅http://git-scm.com/docs/githooks
【讨论】:
这不是 VCS 试图告诉你什么是好的编程风格的问题。尾随空格对他们来说是一件坏事,因为尾随空格可以被 VCS 视为无用的修改。
怎么样?
想象一下你有这样一行:
puts "Hello World"^M^M^M
每个“^M”都是一个尾随空格(放在那里是为了简化)。
另一个开发者不小心把它改成了这样:
puts "Hello World"^M^M
VCS 会将此视为更改。一个根本不干扰代码的无用的,而是一个变化。这种变化甚至可以被 VCS 指出为冲突(这是应该尽可能避免的事情)。此外,它会不必要地污染您的历史记录。
【讨论】: