Git仓库代码在不同操作系统里结尾^M问题的记录
每次按键盘上的Return时,会插入一个称为行结束符的不可见字符^M。 不同的操作系统处理行结束符的方式不同。
在使用Git或者GitHub协作处理项目时,Git可能产生意外结果。例如,您在Windows计算机上操作,而您的协作者是在macOS或者Linux中做的更改。
您可以将Git配置为自动处理行结束符,以便与使用不同操作系统的人员有效地协作。Git具有为本地平台自动转换行尾的“功能”。
方法一:全局设置
"git config --global core.autocrlf"命令用于更改Git处理行尾的方式。 它将采用单一参数。
在Windows系统上:
# 在Windows系统中,将回车符转换为换行符提交到Git仓库,在检出时自动转换回来(即恢复为回车符)
$ git config --global core.autocrlf true
在Linux和Mac系统上
# 在Linux或Mac系统中,提交时不会将回车符转换为换行符,在检出时也不会进行转换。
$ git config --global core.autocrlf input
方法二:按仓库设置
可以选择在项目根目录配置.gitattributes文件来管理Git读取特定存储库中的行结束符的方式。这个文件将覆盖所有项目参与者本地的core.autocrlf设置。这可确保所有用户的行为一致,而不管其Git设置和环境如何。
.gitattributes文件必须在存储库的根目录下创建,且像任何其他文件一样提交。
.gitattributes 文件看上去像一个两列表格:
- 左侧是Git要匹配的文件名。
- 右侧是Git应对这些文件使用的行结束符配置。
示例:
下面是一个示例.gitattributes 文件。 您可以将其用作仓库的模板:
# 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.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
你会注意到,文件是匹配的,即.c、.sln、*.png(用空格分隔),然后给定一个设置,即text、text eol=crlf、binary。我们将在下面介绍一些可能的设置。
- text=auto Git 将以其认为的最佳方式处理文件。 这是一个合适的默认选项。
- 在检出时 text eol=crlf Git 将始终把行结束符转换为 CRLF。 你应将其用于必须保持 CRLF 结束符的文件,即使在 OSX 或 Linux 上。
- 在检出时 text eol=lf Git 将始终把行结束符转换为 LF。 您应将其用于必须保持 LF 结束符的文件,即使在 Windows 上。
- binary Git 会理解指定文件不是文本,并且不应尝试更改这些文件。 该 binary 设置也是 -text -diff 的别名。
在更改行结束符后刷新仓库
设置core.autocrlf选项或提交.gitattributes文件后,Git会自动更改行结束符以匹配新配置。 会发现,Git会报告你未修改的文件的更改。
若要确保存储库中的所有行结束符都与新配置匹配,请使用 Git 备份文件,然后移除并还原所有文件以规范化行结束符。
- 在添加或提交任何更改之前,请验证Git是否已正确应用配置。例如,Git自动确定存储库中的文件是文本文件还是二进制文件。为了避免存储库中的二进制文件损坏,建议在.gitattributes中将文件显式标记为二进制文件。有关详细信息,请参阅Git文档中的gitattributes-按路径定义属性。
- 若要避免丢失对存储库中的文件的任何本地更改,请运行以下命令添加并提交任何未完成的更改。
$ git add . -u
$ git commit -m "Saving files before refreshing line endings"
- 若要更新当前分支上的所有文件以反映新配置,请运行以下命令。
$ git rm -rf --cached .
$ git reset --hard HEAD
- 若要显示重写的规范化文件,请运行以下命令。
git status
- (可选)若要在存储库中提交任何未完成的更改,请运行以下命令。
git commit -m "Normalize all the line endings"