0 Preface/Foreword
0.1 基本概念
Git版本管控工具功能强大,在使用过程中,在多人合作的项目开发过程中,经常会遇到提交代码时出现的warning提醒,尤其是换行符。
Linux/Unix/Mac OS操作系统的换行符使用LF符号(\n),而Windows使用CR(\r)LF(\n)作为换行符。
CR:Carriage Return,回车,ASCII码0x0D,Ctrl为 ^M
LF:Line Feed,换行,ASCII码0x0A,Ctrl为^J
影响换行符的几个因素:
- 操作系统(平台)
- 编辑器(尤其是Windows平台下的编辑器)
- core.autocrlf 变量设置, true, false, input
core.autocrlf不同值的作用:
- true,最终提交到代码库中时,所有文件都认为是text,把所有CRLF转成LF。checkout时,全都转为CRLF;(git add的过程中,会强制将LF转成CRLF; git commit时,强制将CRLF 转成LF)(推荐在Windows中使用,适合多平台协作)
- false,最终提交到代码库中时,保持原来text内容。CRLF还是CRLF,LF还是LF。(适合纯Windows)
- input,最终提交到代码库中时,所有CRLF转成LF。checkout时,保持LF或者CRLF(不转换)。(推荐在Linux/Unix下使用,适合纯Linux/Mac OS)
core.safecrlf不同值的作用:
- true,若有mixed line endings,无法提交,fatal错误
- false,允许提交包含混合line endings的文件
- warn,只是警告,仍然可以提交
core.eol的值类型:当且仅当core.autocrlf为false时,core.eol设置才有效
- lf
- crlf
- native,根据平台,自动转换
Git版本管控的几个区域:
- 工作区, working directory,检出(git checkout <branch>)到对应的分支
- 暂存区,stage,通过git add 添加修改过的文件,git add的动作就是将文件修改放入到了暂存区
- 本地版本库,通过git commit动作,提交成功后,对应的文件会放入版本库中
- 远程版本库,通过git push动作,将本地版本库更新到远程库
0.2 git 变量查看和设置
0.2.1 查看autocrlf
git config core.autocrlf
0.2.2 查看safecrlf
git config core.safecrlf
0.2.3 查看eol
git config core.eol
1 Usage
使用方法可参考文章:
Configuring Git to handle line endings - GitHub Docs
[转载]通过阅读 git-config 文档理解 Git 如何使用autocrlf、safecrlf、eol和.gitattributes处理line-ending - 简书
Git提示“warning: LF will be replaced by CRLF”最详细解释+解决方案-CSDN博客
git如何避免”warning: LF will be replaced by CRLF“提示? - 知乎
https://docs.github.com/zh/get-started/getting-started-with-git/configuring-git-to-handle-line-endings?platform=windows
1.1 Warning
warning: LF will be replaced by CRLF in xxx file
The file will have its origninal line endings in your working directory.
1.2 添加.gitattributes文件
.gitattributes中的内容会覆盖 core.autocrlf的设置,大多数情况下使用配置文件来设置不同文件的line endings。
除了用命令行设置core.autocrlf,还可以用.gitattributes文件管理Git读取特定存储中的行结束符的方式。该文件提到到存储库时,它将覆盖所有存储库贡献者的core.autocrlf设置。可以确保所有用户的行为一致,而不管其他Git设置和环境如何。
# Set the default behavior, in case people don't have core.autocrlf set. * text=auto# Explicitly declare text files you want to always be normalized and converted # to native line endings on checkout. *.c text *.h text# Declare files that will always have CRLF line endings on checkout *.uvprojx text eol=lf#Denote all files that are truly binary and should not be modified.*.bin binary
*.jpg binary
NOTE:可以发现,文件是匹配的,用*.c、*.uvprojx、*.bin(用空格分隔),然后给定一个设置,即为text、text eof=lf、binary。
- text=auto Git将以其认为的最佳方式处理文件。这是一个合适的默认选项。
- 在检出时 text eol=lf Git将始终把行结束符转换为LF,该场景用于必须保持LF结束符的文件,即使在Windows上。
- 在检出时text eol=crlf Git将始终把行结束符转换为CRLF,该场景用于必须保持CRLF结束符文件,即使在Linux或OSX上。
- binary Git会理解指定文件不是文本,并且不应尝试更改该文件。该binary设置也是-text -diff的别名
更改行结束符后刷新仓库注意事项如下:
1.3 常用template(.gitattributes)
# Help git with file types
* text=auto
*.o binary
*.obj binary
*.bin binary
*.lib binary
*.mbn binary
*.svf binary# Always use LF EOL on shell script files, otherwise Docker cannot run scripts
# in a folder mapped from Windows into the Docker container.
*.sh eol=lf# Documentation files are often changed in multiple concurrent branches.
# Use git union strategy when merging, so it keeps both side's modifications
# without conflicts.
README.md merge=union
CHANGELOG.md merge=union
RELEASENOTES.md merge=union
1.4 格式统一转换工具 (unix2dos & dos2unix)
在Windows平台,可以用unix2dos工具将指定文件的line endings转换成适合Windows平台的CRLF。
反之亦然,可以用dos2unix工具将指定文件的line endings转成适合Linux/unix平台的LF。
查看工具版本:
1.5 查看文本文件的换行符
1.5.1 Linux系统中Vim
用VIM编辑文本,保存后,字符总数比实际字符多一个,这是为什么?
因为:VIM等工具,会默认在文件末尾添加一个换行符'\n',不管当前需不需要换行。
查看字符数量工具:wc
常用选项:
- -c ,统计字节个数
- -m,统计字符个数
- -l,统计换行符个数
1.5.2 hexdump工具
hexdump工具可以用来查看文件中所有字符内容,包括invisible character。
hexdump -c file_name
可以发现,3.txt文件,末尾有一个换行符0a,显示出来就是一个黑点。
1.5.3 裁剪文件工具truncate
truncate工具 可以用来将裁剪文件大小。
1.5.4 查看文件类型file
利用file命令,也可初步得知文本是否包含换行符及换行符的类型。
1.5.5 文件属性
NOTE:如果文件文件已经包含了换行(CRLF或者LF),不管是在windows下还是Linux进行编辑,换行符都会与原始值保持一致(编辑器自动识别功能)。
1.5.6 Notepad++设置eol格式
Edit > EOL conversion >