我想强制Git在Windows下只使用LF而不是CR+LF检出文件。
我检查了两个配置选项,但没有找到正确的设置组合。
我想转换所有文件有LF换行,并保持在文件中的LF。
注意:我使用了自专制=输入,但这只是修复文件时,你提交他们。
我想强迫他们使用LF。
可能我说得不太清楚
存储库已经使用LF,但是签出的文件使用LF
Git for Windows使用CR+LF
我想强迫Git用LF来获取它们:
强制Unix行结束符。
$ git config --list | grep crlf
core.autocrlf=input
在Windows中获得LF结尾的正确方法是首先设置核心。专制的虚假:
git config --global core.autocrlf false
如果使用msysgit,则需要这样做,因为它在系统设置中将其设置为true。
现在git不会做任何行结束归一化。如果你想让你签入的文件规范化,可以这样做:在你的.gitattributes中为所有文件设置text=auto:
* text=auto
并设定核心。Eol to lf:
git config --global core.eol lf
现在,您还可以通过运行将单个repo切换到crlf(在工作目录中!)
git config core.eol crlf
在完成配置之后,您可能希望git对repo中的所有文件进行规范化。要做到这一点,请转到你的repo的根目录并运行这些命令:
git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f
如果你现在想让git也规范化你工作目录中的文件,运行这些命令:
git ls-files -z | xargs -0 rm
git checkout .
OP在他的问题中补充道:
使用msysgit签出的文件正在使用CR+LF,我想强制msysgit用LF获取它们
第一个简单的步骤仍然在.gitattributes文件中:
# 2010
*.txt -crlf
# 2020
*.txt text eol=lf
(正如孙子注释中提到的,指的是.gitattributes行结束转换),以避免对具有正确eol的文件进行任何CRLF转换。
我一直推荐git配置——global core。禁止任何转换(这将应用于所有版本文件)
参见跨平台git配置的最佳实践?
从Git 2.16(2018年第一季度)开始,你可以使用Git add—renormalize。立即应用那些.gitattributes设置。
但是第二个更强大的步骤涉及到一个gitattribute过滤器驱动程序和添加一个smudge步骤
每当您要更新工作树时,脚本都可以强制LF eol和您想强制的任何其他格式化选项(仅针对您在.gitattributes中指定的文件)。
如果“clear”脚本什么都不做,那么(在提交之后)您将转换您的文件,应用您需要它们遵循的格式。
上下文
如果你
我想强制所有用户在文本文件中使用LF行结束符
你不能保证所有用户都改变他们的git配置,
你可以从git 2.10开始。2.10或更高版本是必需的,因为2.10修复了text=auto和eol=lf的行为。源。
解决方案
把一个.gitattributes文件放在你的git仓库的根目录下,包含以下内容:
* text=auto eol=lf
提交它。
可选的调整
您还可以在存储库的根目录中添加.editorconfig,以确保现代工具创建具有所需行尾的新文件。
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
在Windows中获得LF结尾的正确方法是首先设置核心。专制的虚假:
git config --global core.autocrlf false
如果使用msysgit,则需要这样做,因为它在系统设置中将其设置为true。
现在git不会做任何行结束归一化。如果你想让你签入的文件规范化,可以这样做:在你的.gitattributes中为所有文件设置text=auto:
* text=auto
并设定核心。Eol to lf:
git config --global core.eol lf
现在,您还可以通过运行将单个repo切换到crlf(在工作目录中!)
git config core.eol crlf
在完成配置之后,您可能希望git对repo中的所有文件进行规范化。要做到这一点,请转到你的repo的根目录并运行这些命令:
git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f
如果你现在想让git也规范化你工作目录中的文件,运行这些命令:
git ls-files -z | xargs -0 rm
git checkout .
我经常回到这个问题上,尽管其他答案都不太适合我。
也就是说,对我来说,正确的答案是其他答案的混合。
我发现以下方法是有效的:
git config --global core.eol lf
git config --global core.autocrlf input
对于在这些全局设置设置之后检出的回购(Git存储库),所有内容都将检出为回购中的任何内容—希望是LF (\n)。
任何CRLF都将在签入(提交)时转换为LF。
对于您已经签出的现有回购-在回购中有正确的行尾,但不是您的工作副本-您可以运行以下命令来修复它:
git rm -rf --cached .
git reset --hard HEAD
这将递归地(-r)删除(rm),不提示(-f),所有文件,除了那些你已经编辑(——cached),从当前目录(.)。然后重置将所有这些文件返回到它们具有真实行结束符的状态(与repo中的内容匹配)。
如果你需要在repo中修复文件的行结束符,我建议你使用IntelliJ或Sublime Text这样的编辑器,但我相信任何好的编辑器都可能支持这一点。