以下情况:
我正在一台运行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
假设你有GNU grep和perl,这将递归地将当前目录下的非二进制文件中的CRLF转换为LF:
find . -type f -exec grep -qIP '\r\n' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
工作原理
在当前目录下递归查找;改变。博客或其他子目录限制替换:
find .
只匹配常规文件:
-type f
测试文件是否包含CRLF。排除二进制文件。对每个常规文件运行grep命令。这是排除二进制的代价。如果你有一个旧的grep,你可以尝试使用file命令构建一个测试:
-exec grep -qIP '\r\n' {} ';'
将CRLF替换为LF。带有第二个-exec的'+'告诉find积累匹配的文件并将它们传递给命令的一个(或尽可能少的)调用——就像管道到xargs,但如果文件路径包含空格、引号或其他shell元字符则没有问题。-pi中的i告诉perl在适当的位置修改文件。您可以在这里使用sed或awk,并做一些工作,您可能会将'+'更改为';',并为每个匹配调用一个单独的进程:
-exec perl -pi -e 's/\r\n/\n/g' {} '+'