【问题标题】:Git can't check out on Linux with LF a file that was stored with CRLFGit 无法使用 LF 在 Linux 上签出使用 CRLF 存储的文件
【发布时间】:2019-06-11 14:40:14
【问题描述】:

我正在 Linux 上从https://github.com/winlibs/libjpeg 检查一个第三方项目“libjpeg”(这只是一个例子,实际上我在许多其他项目中也有同样的问题)。我有以下 Git 行尾配置。

我只配置了全局设置(设置为以 LF 行结尾结帐):

$ git config --system -l | grep core
core.eol=lf
core.autocrlf=false

$ git config --global -l | grep core
core.eol=lf
core.autocrlf=false

没有关于行尾的本地(repo)设置。

我阅读了这篇关于 Git 行尾配置的文章:https://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line,我认为我的配置应该为 Linux 上的所有文本文件提供 LF。但是它不起作用。我在我的工作区中得到了 CRLF。例如:

~/gitclonetest/libjpeg$ file libjpeg.map
libjpeg.map: ASCII text, with CRLF line terminators
~/gitclonetest/libjpeg$ cat -v libjpeg.map
LIBJPEG_9.0 {^M
  global:^M
    *;^M
};^M

有人可以帮助我了解我缺少什么吗?我的目标是在 Linux 主机上克隆所有文本文件(适用于任何项目)时自动将其转换为 LF。

更新:目标是将 Git 配置为使用 LF 在 Linux 主机上签出,即使当时文件是使用 CRLF 存储在存储库中的。

【问题讨论】:

  • 可能,在存储库中提交的文件已经有 CRLF 行结尾。如果是这种情况,并且您指示 Git 根本不要弄乱行尾——就像在 Linux 上通常那样——那么 Git 将保留文件存储库副本中的 CRLF 行尾,将该文件解压缩为有用的、可编辑的 Linux 文件时。也就是说,如果您告诉 Git:完全保留此二进制数据,Git 会这样做。二进制数据是文本这一事实并不重要。
  • @torek,我已经更新了我的问题。如果我现在贴的flags是错的,你能告诉我,你建议用哪些flags来实现到LF的转换?在我看来,我尝试了所有可能的组合,但没有一个奏效。
  • 我检查了(通过克隆存储库),确实提交的文件中有 CRLF 行结尾。你可以告诉 Git 在转换过程中修改这些文件(因为文件是从索引中提取到工作树的),但是因为你在一个“好”的操作系统(Linux)上,你一般不应该这样做。编写此库的人希望您在 Git 内部保留带有 CRLF 行结尾的已提交文件。
  • @torek,那么我的情况的解决方案是什么?是的,很明显该文件是使用 CRLF 提交的。但是我想在 Linux 上结账时总是获得 LF。我不在乎文件提交了哪些行,我只想让 Git 用我对 Git 说的行来检查它。不应该 core.eol=lf 这样做吗?如果不是,那么应该使用什么设置?
  • 在这种情况下,您需要一个带有指令的.gitattributes 文件:text eol=lf 用于这些特定文件。但效果会是,在您所做的每一个 new 提交中,存储在 repository 中的文件将仅具有 LF 行结尾,这与提交的人的愿望相反将文件放入以 CRLF 行结尾的存储库中。在这种情况下,让 Git 执行此操作毫无意义:您可以提取所有文件,将它们全部转换一次,然后提交。从本质上讲,您是在声明以前的存储库维护者是错误的。 [继续]

标签: git eol core.autocrlf


【解决方案1】:

问题是您将core.autocrlf 设置为true。文档说明如下:

将此变量设置为“true”与将所有文件的文本属性设置为“auto”以及将 core.eol 设置为“crlf”相同。如果您想在工作目录中使用 CRLF 行结尾并且存储库具有 LF 行结尾,请设置为 true。

您绝对不想在 Unix 或 Linux 系统上将该变量设置为 true;它应该设置为false,除非您使用的是 Windows 系统(即使这样也有更好的选择)。

【讨论】:

  • 也试过这个 - 同样的问题。 $ git config --system -l | grep core core.eol=lf core.autocrlf=false $ git config --global -l | grep core core.eol=lf core.autocrlf=false $ rm -rf libjpeg;混帐克隆github.com/winlibs/libjpeg 2>/dev/null;文件 libjpeg/libjpeg.map libjpeg/libjpeg.map:ASCII 文本,带有 CRLF 行终止符 现在也将更新问题以使其更清晰...
【解决方案2】:

你很可能已经设置了一些标志,告诉 git 搞乱 EOL 格式(这些标志一团糟)。如果你不想让 git 搞砸它们,你可以通过将其添加到 .gitattributes 来做到这一点:

* -text

这样,当您添加文件或结帐时,git 会弄乱文件。如果您需要其他类型的东西(例如,真正的自动 EOL 转换),您可以在那里查看可用的东西。

https://git-scm.com/docs/gitattributes

无论哪种方式,都不要使用您在问题上使用的标志。他们一团糟。

【讨论】:

  • 你能告诉你还有哪些标志(在哪里检查)?我想我除了上面描述的以外没有别的了。另一个问题:您建议使用 .gitattributes.. 起初,我无法将此文件添加到 repo,因为它是外部 repo(不是我开发的)。其次,我的问题的意义是理解为什么如果我做的一切都正确,默认配置不起作用。我还应该检查什么?
  • @AlexanderSamoylov 这些标志是您在问题中描述的标志。他们是一团糟,真的。它们就像 git 上的 EOL 处理的第一次迭代。然后创建了第二个(使用属性的那个)。仅当您将其添加到 .git/info/attributes 时,您才能在您的回购中拥有相同的东西。那里有关于如何做事的好信息,希望它能满足您的要求:git-scm.com/docs/gitattributes
  • 正如我在上面告诉你的那样,我无法修改 repo。但是,我阅读了您的链接并尝试了全局 /etc/gitattributes 文件。它没有帮助。我尝试的第二个是:“git config --system core.eol lf”结合了core.autocrlf的所有3个不同值(输入、假、真)。它也没有帮助。关于我的标志中的“混乱”......实际上我只设置了 2 个标志:用户(--global)级别的 core.eol 和 core.autocrlf。我发布了另一个问题来说明我的问题是其他的都没有设置。
  • 你能在你的主机上尝试克隆 libjpeg 并给我这样一个全局标志的组合,使它可以用 LF 克隆吗?我只是想知道是否有人可以实现它。
  • @AlexanderSamoylov 我并不是说你的设置是一团糟。我的意思是,您使用的标志的实现在 in git 中是一团糟。和 .git/info/attributes 可以在您的 local repo 上修改,而不会弄乱原始 repo 或分支。
【解决方案3】:

Old, but still correct answer 关于 Git 中的 EOL-headache

简而言之:

core.autocrlf = false 
core.eol = native

将在所有和任何混合操作系统上产生正确的 EOL

【讨论】:

  • 懒獾,我试过你的设置,但它不适用于github.com/winlibs/libjpeg(你能在你的主机上重现它吗?)。 $ git config --system -l | grep core core.eol=native core.autocrlf=false $ git config --global -l | grep core core.eol=native core.autocrlf=false $ rm -rf libjpeg; git clone github.com/winlibs/libjpeg >& /dev/null;文件 libjpeg/libjpeg.map libjpeg/libjpeg.map:ASCII 文本,带有 CRLF 行终止符
  • @AlexanderSamoylov,好吧,试试= input。我没有|使用 Git(我在 Mercurial 方面)并且现在还没有 LF-OS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2017-08-30
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多