以下情况:
我正在运行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
8条答案
按热度按时间liwlm1x91#
我为你做这件事。相当直接的过程。
dos2unix filename
多亏了toolbear,这里有一个递归替换行尾并正确处理空格、引号和shell元字符的一行程序。
find . -type f -exec dos2unix {} \;
如果您使用的是dos2unix 6.0二进制文件,将被忽略。
r1wp621o2#
假设您有GNU
grep
和perl
,这将在当前目录下的非二进制文件中递归地将CRLF转换为LF:它的工作原理
在当前目录下递归查找;将
.
更改为blog
或whatev
子目录以限制替换:仅匹配常规文件:
测试文件是否包含CRLF。排除二进制文件。对每个常规文件运行
grep
命令。这是排除二进制文件的代价。如果您有一个旧的grep
,可以尝试使用file
命令构建测试:将CRLF替换为LF。带有第二个
-exec
的'+'
告诉find
累积匹配的文件,并将它们传递给命令的一次(或尽可能少的)调用——就像管道连接到xargs
一样,但如果文件路径包含空格、引号或其他shell元字符,则不会出现问题。-pi
中的i
告诉perl就地修改文件。您可以在这里使用sed
或awk
进行一些工作,您可能会将“+”更改为“;”并为每个匹配调用单独的过程:5lhxktic3#
这里有一个更好的选择:Swiss File Knife。它在子目录中递归工作,并正确处理空格和特殊字符。
你所要做的就是:
奖励:sfk还可以进行很多其他转换。请参阅下面的完整列表:
EDIT:一句警告:在包含二进制文件的文件夹上运行此命令时要小心,因为它会有效地破坏您的文件,尤其是.git目录。如果是这种情况,请不要在整个文件夹中运行sfk,而是选择特定的文件扩展名(.rb、.py等)。示例:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
uelo1irk4#
这更安全,因为它可以避免损坏您的git repo。将.git、.svn添加或替换为.bzr、.hg或任何您使用的源代码控制添加到not列表中。
o7jaxewo5#
在OS X上,这对我很有用:
警告:请在执行此命令之前备份目录。
guicsvcw6#
以下是使用sed的解决方案:
-i
表示就地备份,如果您也要创建备份,请使用-i.bak
's/\r$//'
将替换每行末尾的所有回车(\r
)ulmd4ohb7#
将所有行尾转换为UNIX行尾(LF)
将所有行尾转换为Windows行尾(CRLF)
-v
/--verbose
开关不是必需的,但会将要转换的文件输出到控制台。dos2unix
和unix2dos
都是无处不在的轻量级工具,它们默认安装在我使用过的每一个类UNIX系统上,并且它们默认跳过非文本文件,这样可以安全地在整个目录上使用。euoag5mw8#
这对我在wsl2上将所有java文件从CRLF更改为LF起到了作用