关于行尾
每次在键盘上按 return 时,都会插入一个称为行尾的不可见字符。不同的操作系统对行尾的处理方式不同。
当你在项目中与 Git 和 GitHub 协作时,如果出现以下情况,Git 可能会产生意外的结果:例如,你在 Windows 机器上工作,而你的协作者在 macOS 中做出了更改。
你可以配置 Git 自动处理行尾,以便你可以与使用不同操作系统的其他人有效协作。
行尾的全局设置
git config core.autocrlf
命令用于更改 Git 处理行尾的方式。它采用一个参数。
在 macOS 上,你只需将 input
传递给配置。例如
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
在 Windows 上,你只需将 true
传递给配置。例如
$ git config --global core.autocrlf true
# Configure Git to ensure line endings in files you checkout are correct for Windows.
# For compatibility, line endings are converted to Unix style when you commit files.
在 Linux 上,你只需将 input
传递给配置。例如
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
每个存储库的设置
或者,你可以配置一个 .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 - 为每个路径定义属性。 -
为了避免丢失对存储库中文件的任何本地更改,请通过运行以下命令添加并提交任何未完成的更改。
Shell git add . -u git commit -m "Saving files before refreshing line endings"
git add . -u git commit -m "Saving files before refreshing line endings"
-
要更新当前分支上的所有文件以反映新配置,请运行以下命令。
Shell git rm -rf --cached . git reset --hard HEAD
git rm -rf --cached . git reset --hard HEAD
-
要显示重写的规范化文件,请运行以下命令。
Shell git status
git status
-
或者,要提交存储库中的任何未完成的更改,请运行以下命令。
Shell git commit -m "Normalize all the line endings"
git commit -m "Normalize all the line endings"
延伸阅读
- 自定义 Git - Git 属性,载于 Pro Git 书籍中
- git-config,载于 Git 手册页中
- 入门 - 首次 Git 设置,载于 Pro Git 书籍中
- 注意你的行尾,作者 蒂姆·克莱姆