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

为什么git关心我文件中的尾随空格?,git,whitespace,Git,Whitespace,我用什么样的风投来担心我把什么放在我的文件里,这有什么关系?我不明白这是什么意思。git是版本控制还是语法检查器?git根本不在乎。示例pre-commit钩子执行空格检查,以演示如何编写钩子,但默认情况下未启用;您必须使它可以执行任何操作。正如霍布斯所写,示例预提交钩子可能正在检查尾随空格。要禁用它,请查看.git/hooks,确保其中的文件不可执行 挂钩启用的一种可能方式是,如果您在FAT格式的闪存驱动器上移动回购,那么可执行位可能已设置。为什么?因为尾随空格很容易丢失,导致虚假更改和未应用

我用什么样的风投来担心我把什么放在我的文件里,这有什么关系?我不明白这是什么意思。git是版本控制还是语法检查器?

git根本不在乎。示例pre-commit钩子执行空格检查,以演示如何编写钩子,但默认情况下未启用;您必须使它可以执行任何操作。

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


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

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

也就是说,这是一个预提交的问题:您可以编辑它,或者禁用它,或者配置尾随空白(可能仅适用于某些类型的文件),使其不被视为错误



默认情况下,
预提交
钩子应该被禁用
,但用于安装它们的较旧版本(1.6.0之前)通过关闭可执行权限关闭,这可能无法在FAT等非UNIX文件系统上工作;从1.6.0开始,通过添加“.sample”后缀关闭(禁用)安装它们。

这是因为Git最常见的用途之一是通过电子邮件发送修补程序系列。尾随空格会给电子邮件带来麻烦,因此通常会被删除,这意味着在通过电子邮件发送修补程序并应用修补程序的过程中,任何尾随空格都会丢失。这反过来意味着,如果repo中的行上有尾随空格,但应用的修补程序中没有尾随空格,则在应用修补程序时,可能会出现虚假冲突,或意外的额外更改


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

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

怎么会这样

假设你有这样一行:

puts "Hello World"^M^M^M
其中每个“^M”都是一个尾随空格(放在此处以简化)

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

puts "Hello World"^M^M

风投将把这视为一种变化。一个毫无用处的,根本不干扰代码,只是一个改变。这种变化甚至可以被风投公司视为冲突(这是应该尽可能避免的)。此外,它会污染您的历史记录,而无需使用。

您可以通过使用--no verify开关绕过此问题,请参见

这就是为什么在较新版本中,示例挂钩使用“.sample”后缀,而不是没有可执行权限。是的,我想是这样的,但我想确保我在查看Git历史记录时澄清了这一点,并意识到我是错的。正如手册页所说的那样,这是很容易犯的错误:
默认的预提交钩子,启用时,捕获带有尾随空格的行的介绍,并在找到此类行时中止提交。
因此这是默认值,但默认值未启用,这更像是一个示例。哦,天哪,使用git“通过电子邮件发送修补程序”?git不是关于远程存储库和在它们之间发送更改吗?相反,我要说的是,空白错误通常是很糟糕的,因为它们会使差异看起来很愚蠢。@Gybraham通过电子邮件发送补丁是许多项目的代码审查工作方式,比如Git最初为之编写的Linux内核。许多开源项目维护者只会从受信任的子项目维护者的存储库中获取补丁,而所有其他补丁都会通过电子邮件发送,在应用它们之前可以在那里公开查看和评论。我使用Samba将存储库从Linux服务器导出到Mac(说来话长!)。默认情况下,Samba对导致样本预提交钩子触发的所有内容设置执行位。我通过将“hooks”重命名为“sample hooks”修复了这个问题,因为我没有为这个repo使用任何钩子。@apphacker:默认预提交钩子使用的检查是关于通过电子邮件发送补丁,而不是关于编程风格。+1对于Bjorn(关于不需要开发人员强制执行他们的风格理念,我在该领域最讨厌的是GCC),请参见,区分前一次提交引入的“旧”空格错误和下一次提交的当前阶段代码引入的新空格错误。