如何强制git在windows下使用LF而不是CR + LF?

sor*_*rin 302 git msysgit

我想强制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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ial 417

在Windows中获取LF结尾的正确方法是首先设置core.autocrlffalse:

git config --global core.autocrlf false
Run Code Online (Sandbox Code Playgroud)

如果使用msysgit,则需要执行此操作,因为它将其设置为true系统设置.

现在git不会做任何行结束规范化.如果您希望签入的文件进行规范化,请执行以下操作:text=auto.gitattributes所有文件中设置:

* text=auto
Run Code Online (Sandbox Code Playgroud)

并设置core.eollf:

git config --global core.eol lf
Run Code Online (Sandbox Code Playgroud)

现在你也可以通过运行将单个repos切换到crlf(在工作目录中!)

git config core.eol crlf
Run Code Online (Sandbox Code Playgroud)

完成配置后,您可能希望git规范化repo中的所有文件.为此,请转到repo的根目录并运行以下命令:

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f
Run Code Online (Sandbox Code Playgroud)

如果您现在希望git也规范化工作目录中的文件,请运行以下命令:

git ls-files -z | xargs -0 rm
git checkout .
Run Code Online (Sandbox Code Playgroud)

  • 可能值得一提的是,您可以在*同时*克隆相关存储库时设置此配置,例如“git clone --config core.autocrlf=false <repo path>”。 (9认同)
  • 我正在致命的路径''没有匹配任何文件,就在`git diff --cached --name-only -z |之后 xargs -0 git add` (3认同)
  • 什么是`git diff --cached --name-only`的输出? (3认同)
  • 底部命令的作用:首先从 git 中删除所有文件(但实际上保留它们!) `git rm --cached -rf .` 然后仅显示已更改的文件的名称(您删除的文件) -z: null-terminate | 添加它们(-0:空终止) `git diff --cached --name-only -z | xargs -0 git add -f` <- 这可以确保你的 git 历史记录良好且 LF。空终止允许文件名中出现奇怪的东西。 (2认同)

Ben*_*age 207

我经常回到这个答案,虽然这些都不适合我.那就是说,对我来说正确的答案是其他人的混合.

我发现的作品如下:

 git config --global core.eol lf
 git config --global core.autocrlf input
Run Code Online (Sandbox Code Playgroud)

对于在设置全局设置后检出的repos,所有内容都将以repo中的任何内容进行检出 - 希望LF(\n).任何CRLF将被转换为只LF在登记.

使用已经签出的现有仓库 - 在仓库中有正确的行结尾而不是工作副本 - 您可以运行以下命令来修复它:

git rm -rf --cached .
git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

这将删除(rm)recursively(r)而不使用prompt(-f),除了那些已经编辑过的文件(--cached),从当前目录(.).在reset随后返回所有这些文件到他们自己的真实行结束(匹配什么在回购)的状态.

如果你需要在repo中修复文件的行结尾,我建议你抓住一个编辑器,让你像IntelliJ或Sublime Text一样批量完成,但我相信任何一个好的人都可能支持这个.

  • 我们有一个带有子目录的存储库,需要不同的行结束处理。因此,设置全局选项对此不起作用。甚至不在单个回购中。你如何在 .gitattributes 中应用这些相同的设置? (2认同)
  • `core.autocrlf input` 选项会覆盖 `core.eol` 设置,因此设置这两个选项是多余的。(参见 https://www.git-scm.com/docs/git-config) (2认同)

Von*_*onC 88

OP在他的问题中补充道:

使用msysgit检出的文件正在使用CR+LF,我想伪造msysgit来获取它们LF

第一个简单步骤仍然在.gitattributes文件中:

*.txt -crlf
Run Code Online (Sandbox Code Playgroud)

,以避免任何crlf转换为具有正确的eol文件.

查看跨平台git配置的最佳实践?


但第二个更强大的步骤涉及gitattribute过滤器驱动程序并添加涂抹步骤

过滤驱动程序

每当你更新你的工作树,脚本可以,只为你在指定的文件git config --global core.autocrlf false,迫使.gitattributes你要执行的任何其他格式化选项.
如果" LF eol"脚本没有做任何事情,您将(在提交后)转换文件,完全应用您需要遵循的格式.

  • @Sorin:所有带有“.txt”扩展名的文件。最好首先建立此规则并在特定组上进行测试,然后再推广到 *,并添加否定规则“!*.xyz ...”以从该规则中排除一些文件。 (2认同)
  • 现在 `.gitattributes` 行应为: `*.txt text eol=lf` 根据 https://www.git-scm.com/docs/gitattributes (2认同)

kop*_*por 44

上下文

如果你

  1. 想强制所有用户拥有文本文件的LF行结尾
  2. 你无法确保所有用户都改变他们的git配置,

你可以从git 2.10开始.2.10或更高版本是必需的,因为2.10修复了text = auto和eol = lf的行为.来源.

.gitattributes文件放在git存储库的根目录中,其中包含以下内容:

* text=auto eol=lf
Run Code Online (Sandbox Code Playgroud)

承诺吧.

可选调整

您还可以.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
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说是最好的解决方案.我还将它与http://editorconfig.org结合起来,这样当我在Intellij中写作时,我会写出LF EOL. (3认同)
  • 这是迄今为止最好的解决方案。无需手动运行任何配置命令! (2认同)

kus*_*sma 26

core.autocrlf=input是您想要的正确设置,但您可能必须执行git update-index --refresh和/或git reset --hard更改才能生效.

随着core.autocrlf设置为input,git会不适用于退房换行转换(所以如果你在回购有LF,你会得到LF),但将确保万一你搞砸了,并在工作介绍一些CRLFs以某种方式复制,他们不会进入回购.

  • 命令应该是git rm --cached -r.&& git reset --hard (19认同)

归档时间:

查看次数:

190337 次

最近记录:

5 年,10 月 前