为什么git关心我文件中的尾随空格?

时间:2009-10-17 22:42:44

标签: git whitespace

我用什么VCS来担心我放入文件的内容是什么生意?我不明白这里的意思。是git版本控制还是语法检查?

6 个答案:

答案 0 :(得分:31)

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

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

答案 1 :(得分:11)

Git根本不关心。 示例预提交挂钩执行空白检查,作为如何编写挂钩的演示,但默认情况下它不是启用;你必须让它可执行它才能做任何事情。

答案 2 :(得分:4)

为什么呢?因为尾随空格很容易丢失,导致虚假更改并且不应用补丁(因为空白更改)。这是符合编程风格的原因。

那说这是pre-commit hook的问题:您可以编辑它,或者禁用它,或者配置尾部空格(可能只针对某些类型的文件)不被视为错误。


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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

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

怎么样?

想象一下你有这样的一句话:

puts "Hello World"^M^M^M

每个" ^ M"是一个尾随的空格(放在那里简化)。

另一位开发人员意外地将此更改为:

puts "Hello World"^M^M

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

答案 5 :(得分:1)

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