合并时避免空格冲突

221

我遇到了一个问题,一个很大的提交改变了约一千行代码,去除了每行末尾的空格和制表符前面的空格。

该项目还有大约50个拉取请求,当我的提交合并时,所有拉取请求都会产生冲突。有没有办法设置Git,以便在合并未来提交时,忽略其中一个仅涉及空格更改的冲突呢?

修改Git本身或使用第三方工具都不可行,但使用钩子是可以的。


可能是 git 空格困扰 的重复问题。 - Cees Timmerman
3个回答

298
 git merge -Xignore-all-space

或者(更加精确地说)

 git merge -Xignore-space-change

这应该足以在合并过程中忽略所有与空格相关的冲突。

参见git diff

--ignore-space-change

忽略空格数量的变化。
这将忽略行末尾的空格,并将所有其他一个或多个空格字符序列视为等效。

--ignore-all-space
忽略行间空格进行比较。即使一行有空格而另一行没有,这也会忽略它们之间的差异。
ks1322 在评论中提供了一个好建议:
值得合并使用 --no-commit 并在实际提交前审核合并。

OP Callum Macrae 报告说,在这种情况下,合并过程会顺利进行,并且将拉取请求补丁中包含的尾随空格应用于本地文件。
不过,OP 使用了一个预提交 hook 来处理这些结尾空格。
(我猜有点类似于这个,也可以在这里找到相关信息。)
OP 的预提交 hook 在这里被引用
除去结尾空格外,还会删除制表符前的一个到三个空格(我的制表符宽度设置为4),并添加 EOLs。
我收到了添加 EOL 的代码会在 Windows 中删除文件的报告,但我无法复制这个问题。

2
从我的测试结果来看,它似乎会删除文件中的所有空格更改。然而,我现在正在使用 pre-commit 钩子来删除尾随空格,所以这不是一个问题。 - callumacrae
1
“git merge -Xignore-space-change” - 好吧,我可以确定这个没有起作用...。我试图删除的那一段空格仍然存在。Git真的很糟糕。 - jww
1
值得使用 --no-commit 合并,并在实际提交之前进行审查。 - ks1322
1
@Preza8 好的。请单独发布一个问题,包括详细信息(操作系统、Git版本、使用的shell等)和一个小例子:这样其他人就可以帮助你了。 - VonC
1
@VonC 感谢您的努力,但我正在处理源代码关闭的问题,所以我必须手动重构该问题,而且我并不那么在意。我想我会用正则表达式或其他方法来解决它。 - Preza8
显示剩余21条评论

2

如果你在合并时发现有很多空格问题,你可以简单地中止它并再次执行,这次使用-Xignore-all-space或-Xignore-space-change。第一个选项在比较行时完全忽略空格,第二个选项将一个或多个空格字符序列视为等效。


0

我喜欢使用meld来合并涉及的冲突,并且可以在Meld>Preferences>TextFilters下设置各种过滤选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接