Git 状态忽略更改的行结尾

Git status ignore changed line endings

我正在努力解决 git 并忽略行尾。这已经被问了一百万次了,但我仍然无法为我的用例弄清楚。几乎不好意思问...就这样了。

背景信息:我使用 PhpStorm IDE 完成大部分 git 操作。底层 PhpStorm 依赖 git 进行实际操作。

我面临的问题是,在 PhpStorm 中,我有一个帮助程序脚本,inserts/updates PhpDoc 在现有文件中进行注释。该脚本使用 LF 作为行尾(不可配置),我的 IDE 默认使用 CRLF,因为我在 Windows。我知道我可以将 IDE 设置为使用 LF 并将整个项目转换为 LF。但这感觉像是不得已的解决方案。

因此,在脚本更新 PhpDoc 并将 CRLF 替换为 LF 之后,这些文件会在 运行 git status 时列出,而我不想要这个。 Git 应该忽略(部分)具有不同行尾的文件。我希望 git status 忽略它的原因是因为 PhpStorm 似乎依赖于它来检测更改的文件并默认检查这些文件以进行提交。手动一个一个地检查这些文件以查看 PhpStorm 告诉我 "These files are identical"(行尾除外)

非常耗时

我已经尝试 this guide,尝试了 core.autocrlf 设置的各种变体,我在 SO 上尝试了数十种解决方案,但仍然没有找到解决方案。

尝试所有这些解决方案确实教会了我一些关于 git 的事情,所以如果理解 git,那么 core.autocrlf=true 设置在这种情况下是无关紧要的,因为这会在提交时将 CRLF 转换为 LF ,但我的目标是将它们排除在 git status 之外。 我一直在玩 git diff --ignore-cr-at-eol,这不再显示差异,但 git status 仍然存在。

I know I could set my IDE to use LF and convert the whole project to LF. But this feels like a last resort solution.

这确实是最好的解决方案。原因是,正如您所指出的,每次您必须处理它时,您都需要重新检查文档并仔细阅读。每个文件有 core.autocrlfcore.eol,然后是 .gitattributes。而且我认为即使具有所有这些灵活性,仍然可能有一些用例没有被涵盖。在我看来,处理行尾是不值得的。

因此,我总是建议进行一次扫描,将 repo 清理成您喜欢的任何结尾,然后完成它。如果您因为与很多人共享存储库而无法立即执行此操作,请实现一个钩子来检查新提交的样式是否正确,甚至可以自动执行清理。然后稍等片刻,直到所有公共部分都完成,最后进行最后的扫描。

很遗憾地告诉您,您希望 git 执行的操作与 git 的内容及其工作方式相悖。 Git 将字节级别的 任何 更改视为更改,您 不能 覆盖它。这是没有意义的。 git diff 允许您这样做 只是为了方便 以便在查看差异时您可以专注于相关更改(例如,正如许多差异工具具有忽略空白更改的设置一样) .

我用的是Webstorm,它支持.editorconfig,它本身支持不同文件的不同配置。我没有时间测试 JetBrain 的 .editorconfig 支持是否会尊重每个文件的设置,但这可能是您的最佳选择。

其他选择

  • 编写一个脚本,从脚本中删除 CR。您可以配置 git hook to run it automatically on commit. Once you do, I believe a checkbox in JetBrains IDEs will appear in the commit dialog

  • 向 JetBrains 提交问题,据我所知,许多编辑器都有 "autodetect line endings for existing files" 选项。