繁体   English   中英

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

[英]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 配置的最佳实践?

从 Git 2.16 (2018 年第一季度)开始,您可以使用git add --renormalize . 立即应用这些.gitattributes设置。


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

过滤器驱动程序

每当您更新工作树时,脚本都可以(仅针对您在.gitattributes指定的文件)强制使用LF eol和您想要强制执行的任何其他格式选项。
如果“ clear ”脚本没有做任何事情,您将(在提交后)转换您的文件,完全应用您需要它们遵循的格式。

语境

如果你

  1. 想要强制所有用户为文本文件使用 LF 行尾,并且
  2. 您无法确保所有用户都更改了他们的 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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM