以下情况:

我正在一台运行OS X的Mac上工作,最近加入了一个项目,到目前为止,该项目的成员都使用Windows。我的首要任务之一是在Git存储库中设置代码库,因此我从FTP中提取目录树,并尝试将其检入到我在本地准备的Git回购中。当我试着这么做的时候,我得到的只有这个

fatal: CRLF would be replaced by LF in blog/license.txt.

由于这将影响“blog”文件夹下面的所有文件,我正在寻找一种方法来方便地将树中的所有文件转换为Unix行结束符。是否有工具可以开箱即用,或者我自己编写脚本?

作为参考,我的Git配置关于行结束:

core.safecrlf=true
core.autocrlf=input

当前回答

在OS X上,这对我来说是可行的:

find ./ -type f -exec perl -pi -e 's/\r\n|\n|\r/\n/g' {} \;

警告:执行此命令前请备份您的目录。

其他回答

find . -not \( -name .svn -prune -o -name .git -prune \) -type f -exec perl -pi -e 's/\r\n|\n|\r/\n/g' {} \;

这是更安全的,因为它避免破坏你的git回购。将.git, .svn添加或替换为.bzr, .hg或任何你使用的源代码控制到not列表中。

从2011年开始,目前公认的答案涉及到在dos2unix中使用find -exec,但现在这是不必要的,因为包括Bash在内的绝大多数shell都支持使用通配符来操作目录中的所有文件(称为路径名扩展或通配符)。

将所有行结束符转换为UNIX行结束符(LF)

dos2unix -v *

将所有行结束符转换为Windows行结束符(CRLF)

unix2dos -v * 

-v/——verbose开关不是必需的,但是会输出哪些文件被转换到控制台。

dos2unix和unix2dos都是无处不在的轻量级工具,它们已经预安装在我曾经使用过的每个基于unix的系统上。默认情况下,它们还跳过非文本文件,使它们可以安全地在整个目录上使用,而不像其他一些答案会破坏二进制文件,如.exe和.png。

 find ./ -type f -name "*.java" -exec perl -pi -e 's/\r\n|\n|\r/\n/g' {} \;

这对我在wsl2上将所有java文件从CRLF更改为LF是有效的

如果使用sed,这里有一个解决方案:

find . -type f -exec sed -i 's/\r$//' {} \;

-i代表in-place,如果你想创建备份,请使用-i.bak

's/\r$//'将替换每行末尾的所有回车(\r)

在OS X上,这对我来说是可行的:

find ./ -type f -exec perl -pi -e 's/\r\n|\n|\r/\n/g' {} \;

警告:执行此命令前请备份您的目录。