我有一个在 Windows 和 Linux 之间使用的存储库。
目前有些文件,例如文件
myfolder/myfile.txt
以 CRLF (DOS) 行结尾存储,并以 CRLF linedendigs 签出。
在我当前的计算机 (Linux) 上 我希望所有文本文件始终以 LF (Linux) 行结尾签出。为此,我做了以下工作:
我确保
git config --get core.autocrlf
输出true
。 (此存储库中未设置任何内容;它是全局值。)
我创建了一个
.gitattributes
文件,其中包含以下内容:
# Set the default behavior
* text=auto
我跑了
git add --renormalize .
然后我检查了
git status
它告诉我:
On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitattributes
nothing added to commit but untracked files present (use "git add" to track)
文件
myfolder/myfile.txt
仍然有CRLF行结尾。
这里出了什么问题?我希望所有文本文件都以 LF 行结尾签出,以及我如何理解文档
--renormalize
选项正是这样做的。 - 但我的情况并非如此。
如果您有
core.autocrlf = true
并且您的文件设置了 text
属性(直接或通过 text=auto
),则在执行签出时,您将始终在工作目录中获得该文件的 CRLF
。
这对于“autocrlf”这个名称来说是有意义的,因为它可以为 Windows 开发人员在 checkout 执行自动 CRLF 转换,但它也确保在签入时将任何 new 文件转换为 LF,以避免 Windows 开发人员引入 LF在回购协议中。
您当前的配置如下图中的红色箭头标记。
根据您提供的信息,我将假设 git 存储库中
myfolder/myfile.txt
的行结尾已经是 LF,这可以解释为什么当您执行 git status
时看不到任何更改。
现在,如果您想解决此问题并将文件签出为 LF,您只需将 autocrlf 切换为 false:
git config --global core.autocrlf false
这会让你处于绿色的情况:
关于
core.eol
的值,你有两个选择:
git config --global core.eol native
或者(我认为更好):
git config --global core.eol lf
如果您选择选项 2,即使在 Windows 上,所有文件也将使用 LF 签出。考虑到所有现代 Windows 程序都可以处理 LF。这不应该是一个问题,并且您不会遇到任何 CRLF 问题,从而导致 docker 容器出现问题。