ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Git换行符警告解析:LF与CRLF的跨平台协作指南

Git换行符警告解析:LF与CRLF的跨平台协作指南 1. 从一条警告说起LF、CRLF到底在吵什么不管你是刚装好Git的新手还是已经在Windows上敲了几年命令的老兵大概率都见过这句话warning: LF will be replaced by CRLF第一次看到这个警告时很多人心里会咯噔一下是不是我的文件要坏了是不是提交出问题了然后去搜索搜出来的答案五花八门有的让你关掉警告有的让你改配置但很少有人把背后的原理讲清楚。我在早期接触Git时也被这个警告搞得很烦后来仔细研究了一遍发现这其实是Git在处理换行符时的一次善意提醒理解它之后这个问题基本就一劳永逸了。先说结论这个警告不是错误不影响提交也不会破坏你的文件。它只是在提示你Git正在把文件里的换行符从一种风格自动转换成另一种风格。但如果你不了解它在转换什么、为什么转换、转换成什么样后面就可能碰到明明改了代码却看不出差异团队里每个人的diff都不一样这类更隐蔽的坑。要搞清楚这个问题得先回到换行符本身。计算机文本文件里的换行并不是一个天然存在的东西不同操作系统在历史上分别采用了不同的字节组合来表示这一行结束了Windows系统使用CRLF也就是回车Carriage Return 换行Line Feed两个字符写成十六进制是0D 0A。CR是回车把光标移回行首LF是换行把光标移到下一行。两个字符组合在一起实现了传统的回车换行动作。Unix/Linux系统以及macOS新版使用LF只有一个字符十六进制是0A。这也是现在绝大多数编程工具、编辑器默认采用的格式。老版macOSMac OS 9及之前使用单独的CR也就是只有回车没有换行现在基本已经绝迹但在某些远古文件里还能看到碰到时反而更麻烦。为什么会有这种差异因为早期电传打字机时代的终端设备物理上是真的需要回车和换行两个动作配合打印机才会把纸卷到下一行并让打印头归位。Windows继承了CRLF这种完整的换行方式而Unix的设计者觉得一个LF就够了少一个字符省一点传输和存储成本。两种设计长期并行就成了今天跨平台协作时绕不开的兼容性问题。Git本身诞生在Linux生态里它的内部对象库默认把文件内容当作字节流来处理但它有一个非常重要的文本净化机制在把文件写进对象库之前可以按照你的配置把工作区里的换行符统一成一种规范格式通常是LF而在把文件从对象库检出到工作区的时候又可以按照配置把换行符转换成你当前平台需要的格式Windows上常转成CRLF。这一进一出就是Git管理跨平台文本文件的核心逻辑。当我们看到LF will be replaced by CRLF时意味着Git在你**执行添加git add**的时候扫描到文件里的LF并按照你的配置准备在存入对象库时先转换成CRLF或者反过来理解成检出时CRLF会转LF。更准确地说这条警告的实际含义是git add的时候Git发现工作区文件里有LF但是根据配置它认为这个文件应该以CRLF的形式入库或者在检出时会被转换成CRLF所以在你的工作副本里你看到的还是LF但仓库里实际存的内容已经被规范化成CRLF了。这个过程Git会自动完成但因为它改变了你文件的原始字节它会提示你一声。这里有个容易混淆的地方。很多人分不清警告的方向。其实你只要记住一句话警告出现在git add时描述的是文件在下一次检出时会变成什么样子。如果你在Windows上把core.autocrlf设为true那么你添加LF文件时Git会告诉你LF会被替换成CRLF——意思是这个文件在仓库里会以LF保存、检出时变成CRLF。而如果你把core.autocrlf设为input你添加CRLF文件时Git会告诉你CRLF会被替换成LF——意思是Git正在把CRLF转成LF后入库。理解了这一点方向问题就解决了。2. 换行符差异为什么会让你栽跟头换行符不同表面上只是字节差异但在实际开发中会引发一连串让人抓狂的问题。第一个问题就是假diff。你什么都没改只是用编辑器打开文件再保存一下结果git diff显示整个文件所有行都被修改了。原因很简单你的编辑器默认使用LF保存而仓库里的文件原本是CRLF或者反过来。编辑器把每个换行符都改了一遍git看到的自然是每一行都变了。这种diff在代码评审时是灾难评审者无法判断你真正改了哪些逻辑如果带着这种diff合入主干还会污染提交历史。第二个问题是文件在不同工具之间流转时出现莫名的解析异常。比如你在Windows上写了一个shell脚本保存成了CRLF格式然后提交到仓库Linux服务器上拉下来执行#!/bin/bash后面紧接着的CR就可能导致bad interpreter错误。Python脚本也可能因为换行符混在字符串里引发解析问题。前端项目里一些构建工具对配置文件中的换行符敏感也可能出现难以排查的报错。第三个问题是团队成员之间配置不统一。有人用的是Windows 默认Git配置有人用的是macOS有人在Windows上但把core.autocrlf设成了false。结果就是每个人提交到仓库的文件换行符都不一样每次拉动代码都会产生大量无意义的文件变更记录。更麻烦的是这种问题往往是间歇性的有时候明明什么都没动突然就有几个文件显示modified费了半天劲排查最后发现只是换行符被某个工具替换了。第四个问题是历史提交被潜规则地篡改。假设你手头有一个老仓库里面的文件一直是CRLF某一天你引入了.gitattributes文件或者改了core.autocrlf配置下一次提交时Git可能会把所有受影响的文件重新规范化。如果仓库比较大、提交历史比较长这会产生一个巨大的假提交涉及几百个文件却没有任何实际逻辑变更。如果操作不当还会让后续的cherry-pick或者rebase变得异常混乱。所以LF will be replaced by CRLF看起来只是一个小警告背后其实牵涉到跨平台协作、编辑器生态、构建链路、历史维护等多个环节。要彻底解决不能靠眼不见心不烦得系统性地理解并做统一配置。3. 先搞清楚Git的三个换行符配置开关Git主要通过三个配置项来控制换行符行为搞清楚它们的区别是你做出正确选择的前提。第一个是core.autocrlf它是全局级或仓库级的布尔/字符串配置取值有三种true提交时把CRLF转成LF入库检出时把LF转成CRLF到工作区。这是Windows用户的经典推荐配置目的是让仓库里统一存LF、而Windows工作区保留CRLF满足Windows工具链的习惯。input提交时把CRLF转成LF入库检出时不转换保持LF。这个配置适合你在Windows上使用但要求工作区文件保持LF很多现代编辑器默认就是LF或者你希望所有环境下的工作区都统一成LF。macOS/Linux用户通常设成input或直接false。false完全不转换入库是什么样就是什么样检出也是原样。这个配置最诚实但跨平台协作时最容易产生换行符混乱。第二个是core.eol它控制的是Git检出文本文件时应该使用哪种换行符。取值可以是lf、crlf或native默认值跟随当前平台Windows上是CRLF其他平台是LF。这个配置通常和core.autocrlf配合使用如果两者冲突core.autocrlf优先级更高。它的存在意义是即使你不想做提交时转换你仍然可以通过它控制检出时用什么格式。第三个是core.safecrlf它控制的是Git在检测到换行符转换可能导致文件内容变化时是否报错。如果设为trueGit会在转换会改变内容时拒绝操作并报错设为warn则只警告。这个配置比较隐性普通用户很少关注但如果你属于绝对不能容忍文件内容被意外修改的工程洁癖型用户可以把它打开。除了这三个还有一个机制比它们更精确、更推荐——.gitattributes文件。它放在仓库根目录也可以放在子目录对仓库内的文件做细粒度的换行符策略声明。它的作用域是整个仓库对所有人生效而不是只对本地你的配置生效所以团队协作时用.gitattributes统一策略远比让每个人各自改core.autocrlf要靠谱得多。.gitattributes按照文件名模式声明属性常见写法有# 所有文本文件统一使用LF * textauto # 明确指定某些文件为文本且统一用LF *.js text eollf *.py text eollf *.md text eollf # 明确指定某些文件为二进制不做任何转换 *.png binary *.jpg binary *.pdf binary *.zip binary # 某些特殊文件虽然扩展名像文本但要求保持原样 *.bat text eolcrlf *.cmd text eolcrlfGit会根据textauto自动判断文件是文本还是二进制。对于文本文件它在入库时会把CRLF转成LF对于二进制文件完全不碰。eol属性则进一步指定检出时用哪种换行符。常用的组合是仓库统一LF唯独Windows批处理文件.bat/.cmd必须用CRLF否则Windows可能无法正确解析。这种需求靠core.autocrlf一个全局开关是做不到的只有.gitattributes能精确控制。4. 五种解决办法和适用场景现在进入实战。这一节我会给出从简单到规范的五种解决路径每种都附上适用场景和注意事项你根据自己的情况选择。4.1 方案一眼不见心不烦仅忽略警告如果你确认当前项目不存在跨平台协作或者团队里统一使用Windows 同一套编辑器那么这条警告基本不会给你带来实际伤害。你可以直接关掉它git config core.safecrlf false这不会关闭换行符转换只会关闭警告本身也就是Git不再提示你LF will be replaced by CRLF。改完之后再执行git add就不会再看到刷屏的警告了。这个方案适合那种我看过了、明白了、不需要你每次都提醒我的场景。但要注意core.safecrlf false只是静默警告Git该转换还是转换。如果你的仓库里换行符本身已经混乱了隐藏警告并不会让混乱消失。4.2 方案二按平台设置autocrlf适合独立开发者这个方案适合单人项目或者团队规模小、成员之间能口头对齐的场景。Windows用户执行git config --global core.autocrlf true这样仓库入库统一LF检出到工作区统一CRLF。Windows下的记事本、旧版编辑器、批处理脚本都能正常工作。macOS/Linux用户执行git config --global core.autocrlf input入库统一LF检出不转换工作区永远LF。这是macOS/Linux上最经典的配置。独立开发者一般不需要.gitattributes因为仓库里所有文件都是你一个人提交的只要保证你自己的配置一致换行符就不会出问题。4.3 方案三用.gitattributes统一仓库适合团队协作强烈推荐如果你在一个团队里成员有人用Windows、有人用macOS、有人用Linux就别再依赖每个人自己的配置了。你需要在仓库根目录放一个.gitattributes文件把换行符策略变成仓库的宪法。一个比较通用的模板如下# 自动检测文本文件统一转换LF入库 * textauto # 源码文件统一LF *.js text eollf *.ts text eollf *.jsx text eollf *.tsx text eollf *.py text eollf *.java text eollf *.c text eollf *.h text eollf *.cpp text eollf *.hpp text eollf *.cs text eollf *.go text eollf *.rs text eollf *.php text eollf *.rb text eollf *.swift text eollf # Web相关文件 *.html text eollf *.css text eollf *.scss text eollf *.less text eollf *.json text eollf *.xml text eollf *.yml text eollf *.yaml text eollf *.svg text eollf # Markdown和文档 *.md text eollf *.txt text eollf # 配置文件 *.ini text eollf *.cfg text eollf *.conf text eollf *.toml text eollf # Windows脚本必须保留CRLF *.bat text eolcrlf *.cmd text eolcrlf *.ps1 text eolcrlf # 二进制文件不做任何转换 *.png binary *.jpg binary *.jpeg binary *.gif binary *.ico binary *.webp binary *.bmp binary *.pdf binary *.zip binary *.tar binary *.gz binary *.7z binary *.rar binary *.exe binary *.dll binary *.so binary *.dylib binary *.class binary *.jar binary *.war binary *.o binary *.a binary *.woff binary *.woff2 binary *.ttf binary *.otf binary *.eot binary注意点第一行* textauto是核心它让Git自动探测文本文件并在入库时统一转成LF检出时按照平台和eol规则处理。* textauto并没有指定检出时的换行符所以如果文件没有匹配到更具体的eol规则在Windows上检出时默认是native即CRLF。如果你希望仓库LF、工作区也LF需要给对应的文件类型明确eollf。不要轻易对*设置eollf因为这会覆盖掉某些必须保持CRLF的文件类型。要让必须CRLF的文件通过更具体的规则覆盖前面的通用规则。把.gitattributes文件放到仓库根目录并提交同时确保这个文件本身是LF格式你可以在写完后检查一下避免它自己被转换。4.4 方案四让仓库里现存文件统一换行符处理存量项目上面几个方案都假设你从下一个提交开始保持统一但很多老仓库里已经积累了大量混着CRLF和LF的文件。如果你希望仓库内的历史文件也全部统一成LF你需要做一次一次性规范化。步骤是这样的先把.gitattributes文件写好提交到仓库同时提交一个空的规范化前commit。让Git把当前的文件按照新的.gitattributes规则重新规范化# 清除Git索引和工作区之间可能存在的换行符缓存 git rm --cached -r . git reset --hard这样的操作会重新按规则检出所有文件但仅此还不够还需要让Git重新扫描所有文件git add --renormalize .这条命令是Git 2.16以上版本提供的它会按照当前.gitattributes规则重新规范化所有已跟踪的文件不改变文件内容以外的任何东西但会正确地更新索引中的换行符表示。然后提交git commit -m chore: normalize line endings to LF这个提交会比较大因为它涉及所有受影响的文件。但它是一次性冲击以后提交的换行符就稳定了。有一个需要提前确认的地方规范化换行符后你在工作区看到的文件可能都会被重写一遍如果你的编辑器没有设置保持文件原有换行符可能会导致你本地未提交的修改与规范化后的文件冲突。建议在规范化前git stash或者确认工作区干净。4.5 方案五配合编辑器设置治本很多时候换行符问题不是Git配置出错了而是编辑器多管闲事。你在Windows上用VS Code、Sublime Text、Notepad等工具打开一个LF文件默认保存时它可能帮你转换成了CRLF或者反过来。VS Code的设置里你可以通过以下配置控制换行符行为{ files.eol: \n, files.autoGuessEncoding: false, files.trimTrailingWhitespace: true }files.eol设为\n表示新建文件默认用LF设为\r\n表示用CRLF。对于已有文件VS Code在右下角状态栏会显示当前文件的换行符类型LF或CRLF点击一下就能切换。Sublime Text则是在菜单View - Line Endings里选择。Notepad更直接右下角状态栏会显示当前文档的行尾格式双击可以切换。但这里有一个坑如果你的编辑器配置是保存时自动转换那么你就必须要求所有项目成员都用一致的编辑器配置。这也是为什么我始终推荐用.gitattributes做项目级硬约束它比编辑器配置更可靠。编辑器配置是软件变.gitattributes是仓库变。5. 实操过程实录从警告刷屏到彻底安静为了让你更有代入感我模拟一个真实场景一个Windows开发者接手一个项目一打开终端执行git add .就刷屏LF will be replaced by CRLF提交历史里还混着各种换行符不一致的提交。我按下面的流程一步步处理。5.1 第一步查看当前状态先确认Git当前配置git config --global --get core.autocrlf git config --local --get core.autocrlf git config --global --get core.eol如果全局没有设置过一般不会有输出。此时Git默认的行为是core.autocrlf未设置在Windows上仓库内通常保持原样即文件入库时不做转换但不同工具可能在本地把文件改成CRLF。这也解释了为什么老仓库会越来越乱。5.2 第二步检查仓库是否已有.gitattributesls -la | findstr .gitattributes如果不存在就新建一个。如果存在先看看里面写了什么规则避免和现有规则冲突。5.3 第三步创建并提交.gitattributes按上面模板写好.gitattributes后git add .gitattributes git commit -m chore: add .gitattributes for consistent line endings这步很关键。如果你还没提交.gitattributes就执行git add --renormalize .Git会用旧规则扫描文件导致结果不对所以必须先提交。5.4 第四步重新规范化所有文件git add --renormalize . git status这时你会看到很多文件显示为modified。别慌这是正常的它们只是换行符变了内容本身没有逻辑变化。你随便挑几个文件用git diff --stat看一眼会发现改动行数非常多基本上全部行都变了一遍。这其实是所有文件一次性换行符统一的过程。如果执行git add --renormalize .时Git报错说没有这个命令说明你的Git版本低于2.16先升级Git或者改用git rm --cached -r . git reset --hard git add .但老版本这种方式容易误伤未提交的改动所以能升级就升级。5.5 第五步提交规范化结果git commit -m chore: normalize all line endings to LF提交完之后再到项目里新增或修改一个文件执行git add你会发现警告不见了或者至少不再刷屏。因为Git已经按.gitattributes的规则知道你仓库内统一LF、检出按平台转换它不再需要反复提示LF will be replaced by CRLF这种变化了。这里有个小经验如果规范化之后执行git status发现仍然有文件处于modified状态可能的原因是你的工作区文件本身还是CRLF而索引里已经按LF记录了。此时执行一次git checkout -- .把工作区文件按新规则重新检出即可但请确保你没有未提交的修改因为git checkout -- .会丢弃工作区的改动。6. .gitattributes和autocrlf到底选哪个很多人纠结我到底是用core.autocrlf还是.gitattributes我的建议很简单个人开发、项目不跨平台用core.autocrlf就够了配置一条命令的工具链级默认。Windows设truemacOS/Linux设input。团队协作、项目跨平台用.gitattributes作为仓库规则同时建议每个人在本地也设置core.autocrlf作为兜底默认值。.gitattributes会覆盖本地配置所以就算某个人忘了本地设置仓库的统一规则还是会生效。混合大型仓库既有源码又有大量二进制资源还有如.bat这类要求CRLF的文件必须用.gitattributes做精细控制。全局core.autocrlf做不到只有.bat保留CRLF这种细粒度声明。纯Windows内部项目、放弃跨平台可以设置core.autocrlf false让仓库内部完全保持CRLF。但说实话这种做法我不推荐因为现代开发工具链普遍默认LF仓库里保持LF是更通用、更干净的选择。另外要提醒一下.gitattributes会影响仓库内所有文件的新增和检出但是不会自动修改已经在版本控制里的历史文件。这也是为什么上面专门讲了重新规范化的操作。你可以在任何时候把.gitattributes放进一个老仓库但历史提交里的文件不会自动被改写只有新提交才会遵循新规则。如果你发现历史提交里有些文件换行符一直都是乱的状态你当前只能按从此刻起保持一致来处理不要去改写历史。7. 常见问题与排查技巧实录7.1 问题一我设置了core.autocrlf true为什么还有CRLF入库了排查思路如果github或者GitLab页面上显示文件内容是CRLF说明文件在入库时确实保留了CRLF。可能原因.gitattributes里把某些文件标记为binaryGit不会对二进制文件做转换。文件本身被* textauto识别为二进制比如包含特殊字节序列的文件Git判断这不是文本于是跳过转换。你设置的是本地配置但仓库内的.gitattributes优先于本地配置如果.gitattributes里没有对该文件类型声明text也许就不会转换。解决方式在.gitattributes中明确指定该文件类型为text例如*.log text然后重新执行git add --renormalize .。7.2 问题二执行了git add --renormalize后内容没有变化可能原因你还没有提交.gitattributes或者.gitattributes路径没有覆盖到目标文件。Git认为目标文件已经是规范化后的格式了也就是说它们本来就是LF入库没有需要转换的CRLF。文件被标记为binary不参与转换。排查方法用git show --stat查看提交内容或者用十六进制编辑器直接看文件内容确认换行符是0D 0A还是只0A。7.3 问题三warning: LF will be replaced by CRLF 和 warning: CRLF will be replaced by LF 的区别这两个警告方向相反。前者出现在Windows上、core.autocrlftrue或.gitattributes里明确eolcrlf的时候意思是文件在检出时会被转成CRLF后者通常出现在你设置了core.autocrlfinput或者.gitattributes里明确eollf的时候意思是文件在提交时被转成LF入库。两条警告本身都正常不用害怕。但如果同一批文件同时出现两种警告说明仓库里有些文件是CRLF、有些是LF尚未统一。这是需要规范化的信号。7.4 问题四团队里有人提交了CRLF怎么避免以后继续如果仓库里已经有.gitattributes正常情况下不会了。如果还没有右键点击文件查看属性是徒劳直接全仓库排查# 在Windows上检查工作区中哪些文件是CRLF git ls-files | xargs -I {} sh -c file {} | grep -q CRLF echo {}但更省事的办法是让团队约定统一流程先提交.gitattributes再执行一次git add --renormalize .强制仓库统一格式。之后任何人在本地提交Git都会按规则转换。7.5 问题五改了.gitattributes为什么还有人看到警告因为本地Git设置和.gitattributes的优先级关系是.gitattributes的规则优先于git config但不一定会完全压过所有设置。如果.gitattributes里写的是textautoGit需要自己判断文件是文本还是二进制。有些文件类型没有被textauto识别出来Git就会走回core.autocrlf的逻辑。这时如果你本地配置是true而仓库.gitattributes没提到该文件类型就仍可能产生转换和警告。所以严谨的做法是尽可能在.gitattributes里覆盖所有已知的文本文件类型不要把判断完全交给textauto。7.6 问题六用git diff比较时没有实际改动却显示整文件变动这几乎可以断定是换行符问题。先用这一招确认git diff --ignore-space-at-eol如果这样之后diff只剩真正的内容变化说明就是换行符差异。解决方式是规范化仓库同时统一编辑器的换行符策略。临时快速抹掉diff噪声可以用git diff -w它会忽略所有空白字符的变化包括换行符用来评审时看逻辑改动比较方便。但要注意-w不只是忽略换行符还忽略空格和Tab的变化所以评审时还要留个心眼。7.7 问题七仓库内文件显示modified但内容完全没变这种情况也是典型换行符问题工作区文件的换行符与索引中的不一致。比如索引中记录的是LF但你用Windows工具打开保存后变成了CRLFGit就会认为文件变了。处理方法git checkout -- .或者让编辑器把该文件的换行符改回LF再保存。长期解决方案还是统一配置。7.8 问题八不小心把历史提交里的换行符改乱了怎么办如果已经提交了一个换行符大乱斗的commit不用惊恐。可以用git revert回滚这个提交然后重新按规范化流程操作。如果提交已经被推到远端不要改写历史用git revert生成一个反向提交即可。如果老仓库的历史实在乱到不可收拾也可以考虑用git filter-branch或git filter-repo批量重写历史但这是重量级操作建议只在独立分支上做实验确认无误后再执行。我个人不太建议为了换行符问题重写历史成本和风险都偏高收益有限。8. 从源头避免编辑器、工具链和工作流一起堵漏换行符的问题光靠Git配置并不能100%根治因为它的源头其实是开发者本地的工具链。我整理了几条实践经验对降低踩坑概率很有帮助。第一在编辑器层面统一默认换行符。无论是VS Code、Sublime Text、Notepad还是JetBrains全家桶都建议把默认换行符设为LF。你可以不理解为什么LF是主流但你要知道今天几乎所有云平台、构建工具、脚本解释器都默认LF是标准格式。这就像国际标准时间UTC一样大家约定一个基准换算才不会出错。第二配置Git的全局模板。可以新建一个~/.gitconfig里的配置段[core] autocrlf true safecrlf warn eol native这样不管你新建任何项目本地Git都默认有一个合理兜底。第三把.gitattributes的创建做进项目初始化流程。如果你经常创建新项目就做一个项目模板把.gitattributes、.editorconfig一起塞进去。.editorconfig可以进一步约束编辑器的缩进风格和换行符和.gitattributes互补。一个示例.editorconfigroot true [*] charset utf-8 end_of_line lf insert_final_newline true trim_trailing_whitespace true第四在CI里加一道检查。如果团队比较规范可以在持续集成流程里加一个脚本扫描仓库内的文本文件换行符是否符合规则不符合就报错。这样一个不小心提交了混行文件的成员会在合并之前就被拦截而不是等到在线评审时被爆出大量diff。第五谨慎使用关掉警告的配置。core.safecrlf false能让你不再看到警告但也意味着你在主动放弃Git保护你的机会。我的看法是警告不可怕可怕的是你不理解警告时被迫关掉它。如果你能准确说出这条警告在做什么你再决定关不关也不迟。9. 最后再分享一个小技巧如果你已经用了.gitattributes但在Windows上配合一些老旧的命令行工具比如某些批处理、PowerShell脚本、或个别构建脚本依然觉得CRLF/LF来回转换很烦这里有一个额外的偏方为特定目录单独设置规则。比如有些第三方库源码你希望完全保持原样不参与任何换行符转换可以这样写third_party/** -text-text表示这个路径下的文件不被当作文本文件处理完全不做转换。这样全局规则管住项目自己的代码第三方目录隔离开能减少很多莫名其妙的差异。这个技巧我在处理过几个明明啥都没改但diff全变红的历史项目时屡试不爽。特别是那些直接从网上下载的SDK、样例代码里面混着各种换行符把它们单独隔离出去你的主代码仓库就清爽得多。我在实际处理过程中发现绝大多数换行符问题都不是一次配置就能彻底解决的它需要你在Git配置—项目规则—编辑器习惯—团队协作流程四个层面同时发力。但只要你认真把这个机制搞明白了后面无论遇到LF will be replaced by CRLF还是CRLF will be replaced by LF你都不会再慌因为它们对你来说已经不再是需要解决的报错而只是系统在正常工作的提示音。
返回列表