[英]How do I force git to use LF instead of CR+LF under windows?
我想强制 git 在 Windows 下只使用LF
而不是CR+LF
签出文件。 我检查了两个配置选项,但找不到正确的设置组合。
我想它的所有文件转换为LF
,保持LF
上的文件。
备注:我使用了autocrlf = input
但这只是在您提交文件时修复文件。 我想强制它使用LF
来获取它们。
可能我不是很清楚:存储库已经在使用LF
但是使用 msysgit 检出的文件正在使用CR+LF
,我想强制 msysgit 使用LF
获取它们:强制 Unix 行结尾。
>git config --list | grep crlf
core.autocrlf=input
在 Windows 中获得 LF 结尾的正确方法是首先将core.autocrlf
设置为false
:
git config --global core.autocrlf false
如果您使用的是 msysgit,则需要这样做,因为它在其系统设置中将其设置为true
。
现在 git 不会做任何行结束规范化。 如果您希望对签入的文件进行规范化,请执行以下操作:在您的.gitattributes
为所有文件设置text=auto
:
* text=auto
并将core.eol
设置为lf
:
git config --global core.eol lf
现在,您还可以通过运行将单个存储库切换到 crlf(在工作目录中!)
git config core.eol crlf
完成配置后,您可能希望 git 规范化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
对于在设置这些全局设置后签出的存储库,所有内容都将按照存储库中的任何内容进行检出 - 希望是LF
( \\n
)。 任何CRLF
将在签入时转换为LF
。
使用您已经签出的现有存储库 - 在存储库中具有正确的行结尾但不是您的工作副本 - 您可以运行以下命令来修复它:
git rm -rf --cached .
git reset --hard HEAD
这将在没有提示 ( -f
) 的情况下以递归方式 ( r
) 删除 ( rm
),从当前目录 ( .
) 中删除除您已编辑的文件 ( --cached
) 之外的所有文件。 reset
然后将所有这些文件返回到它们具有真实行尾的状态(与存储库中的内容匹配)。
如果您需要修复 repo 中文件的行尾,我建议您使用一个编辑器,让您可以像 IntelliJ 或 Sublime Text 那样批量执行此操作,但我相信任何好的编辑器都可能支持这一点。
OP在他的问题中补充道:
使用 msysgit 检出的文件正在使用
CR+LF
,我想强制 msysgit 使用LF
获取它们
第一个简单的步骤仍然是在.gitattributes
文件中:
# 2010
*.txt -crlf
# 2020
*.txt text eol=lf
(如grandchild 的评论中所述,指的是.gitattributes
End-of-line conversion ),以避免对具有正确eol
文件进行任何CRLF
转换。
而且我一直建议git config --global core.autocrlf false
禁用任何转换(这将适用于所有版本化文件)
从 Git 2.16 (2018 年第一季度)开始,您可以使用git add --renormalize .
立即应用这些.gitattributes
设置。
但是第二个更强大的步骤涉及一个gitattribute 过滤器驱动程序并添加一个涂抹步骤
每当您更新工作树时,脚本都可以(仅针对您在.gitattributes
指定的文件)强制使用LF eol
和您想要强制执行的任何其他格式选项。
如果“ clear
”脚本没有做任何事情,您将(在提交后)转换您的文件,完全应用您需要它们遵循的格式。
如果你
你可以从 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
core.autocrlf=input
是您想要的正确设置,但您可能必须执行git update-index --refresh
和/或git reset --hard
以使更改生效。
将core.autocrlf
设置为input
,git 将不会在结帐时应用换行符转换(因此,如果您在 repo 中有 LF,您将获得 LF),但它会确保万一您搞砸并引入一些工作副本中的 CRLF 不知何故,它们不会进入回购。
您可以在以下位置找到此问题的解决方案: https : //help.github.com/en/github/using-git/configuring-git-to-handle-line-endings
有关如何在 Windows 上解决此问题的简化说明:
行尾的全局设置 git config core.autocrlf 命令用于更改 Git 处理行尾的方式。 它需要一个参数。
在 Windows 上,您只需将 true 传递给配置。 例如:C:>git config --global core.autocrlf true
祝你好运,我希望我有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.