删除某些行的回车符 (^M),但不修改每一行

删除某些行的回车符 (^M),但不修改每一行

我有一些相当长的 C++ 文件,并且git diff --check报告说^M大约 15 个不同行上有几个回车符。这是在 Windows 7 计算机上。在搜索了几个解决方案(即 Visual Studio Advanced Save Options或 Notepad++ 的 EOL 转换)后,它们似乎都在修改每一行,而不仅仅是 Git 抱怨的行。这导致每行的 git diff 都被替换。

这可能是因为之前对这些文件的所有更改也都有回车符^M,而之前对它的提交忽略了任何回车符警告?

运行返回 true,但是当我暂存文件之后git config core.autocrlf运行该文件时,暂存文件不执行任何操作。git diff --cached --check

有什么方法可以移除它们吗?手动前往该行并尝试更改似乎没有帮助。

答案1

15行?

在 notepad++ 中,选择替换。选择扩展。搜索 \r(即 ^M)并替换为空(除非您想要换行符,则替换为 \n)。由于您不想替换所有 ^M,请不要按全部替换,而是选择要替换的那些。

如果您使用常规 Windows 记事本,^M 将显示为方框。您可以删除这些方框。虽然不好看,但确实有用。

答案2

使用dos2unix <file>如果在命令行上。它将修复所需的行尾,如果不需要,它将不执行任何操作。执行 afind . -name "*.cpp" -exec dos2unix {} +以执行多个文件。然后与git diff提交之前进行比较。

最好避免文件中出现混合行尾。这会使合并和跟踪历史记录变得尴尬。

有些编辑器不会改变样式,但我认为如果文件中出现一个 ^M,有些编辑器会采用 dos 样式,并在写入文件时更改所有行尾。

通常可以找到编辑器的设置,使编辑器保持您想要的样式。行尾和制表符设置通常也根据样式进行设置。

答案3

Git 可以使用 自动完成此操作git config --global core.autocrlf true但它在结账时或提交时会执行此操作。因此,如果您的编辑器引入了一些新的不需要的行尾,git 将不会显示暂存的更改,而是会悄悄地处理转换。

我认为,如果不需要的行尾已经在存储库中,则使用 dos2unix。

详情请参见此处的答案: https://stackoverflow.com/questions/10418975/how-to-change-line-ending-settings并阅读http://git-scm.com/book/en/Customizing-Git-Git-Configuration#Formatting-and-Whitespace

答案4

在 Windows 机器上你可以执行以下操作:

for /r %f in (*.js) do "c:\Program Files\git\usr\bin\dos2unix.exe" %f

这将从当前目录向下删除所有带有 .js 扩展名的文件的 CR

相关内容