我想强制git仅使用LF
而不是CR+LF
来检出Windows下的文件。我检查了两个配置选项,但我找不到正确的设置组合。
我希望它将所有文件转换为LF
并将LF
保留在文件上。
备注:我使用了autocrlf = input
,但这只是在提交时修复文件。我想强制它使用LF
来获取它们。
可能我不是那么清楚:存储库已经在使用LF
但是使用msysgit检出的文件正在使用CR+LF
而我想强制使用msysgit来获取LF
:强制Unix行结尾。
>git config --list | grep crlf
core.autocrlf=input
答案 0 :(得分:373)
在Windows中获取LF结尾的正确方法是先将core.autocrlf
设置为false
:
git config --global core.autocrlf false
如果您使用msysgit,则需要执行此操作,因为它在系统设置中将其设置为true
。
现在git不会做任何行结束规范化。如果您希望签入的文件进行规范化,请执行以下操作:在text=auto
中为所有文件设置.gitattributes
:
* text=auto
并将core.eol
设为lf
:
git config --global core.eol lf
现在你也可以通过运行
将单个repos切换到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 .
答案 1 :(得分:181)
我经常回到这个答案,虽然这些都不适合我。那就是说,对我来说正确的答案是其他人的混合。
我发现的作品如下:
git config --global core.eol lf
git config --global core.autocrlf input
对于在设置全局设置后检出的回购,所有内容都将按照回购中的内容进行检出 - 希望LF
(\n
)。在签到时,任何CRLF
都会转换为LF
。
对于您已经签出的现有仓库 - 在仓库中有正确的行结尾而不是您的工作副本 - 您可以运行以下命令来修复它:
git rm -rf --cached .
git reset --hard HEAD
这将删除(rm
)递归(r
)而不提示(-f
),除了您编辑的文件(--cached
)之外的所有文件,从当前目录(.
)。 reset
然后将所有这些文件返回到它们具有真实行结尾的状态(匹配repo中的内容)。
如果你需要在repo中修复文件的行结尾,我建议你抓住一个编辑器,让你像IntelliJ或Sublime Text一样批量完成,但我相信任何一个好的人都可能支持这个。< / p>
答案 2 :(得分:80)
使用msysgit签出的文件正在使用
CR+LF
,我想伪造msysgit以使用LF
第一个简单步骤仍然在.gitattributes
文件中:
*.txt -crlf
,以避免对具有正确eol的文件进行任何crlf转换。
请参阅Best practices for cross platform git config?
但第二个更有力的步骤涉及gitattribute filter driver并添加涂抹步骤
每当您更新工作树时,脚本只能针对您在.gitattributes
中指定的文件强制执行LF eol
和任何其他格式化选项。
如果“clear
”脚本没有执行任何操作,您将(提交后)转换文件,完全应用您需要的格式。
答案 3 :(得分:34)
如果你
你可以从git 2.10开始。需要2.10或更高版本,因为2.10 fixed the behavior of text=auto together with eol=lf。 Source
将.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
答案 4 :(得分:25)
core.autocrlf=input
是您想要的正确设置,但您可能必须执行git update-index --refresh
和/或git reset --hard
才能使更改生效。
将core.autocrlf
设置为input
时,git将不会在结帐时应用换行符(因此如果您在回购中有LF,则会获得LF),但它会确保如果你搞砸并以某种方式在工作副本中引入一些CRLF,它们就不会进入回购。
答案 5 :(得分:0)
您可以在以下位置找到解决此问题的方法: 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为真
祝你好运,希望我能帮上忙。