WSL git EOL配置忽略gitattributes?

时间:2018-06-28 15:21:30

标签: git windows-subsystem-for-linux

我正在使用Windows子系统的Linux git(版本2.17.1)来管理Windows笔记本电脑上的存储库,但这使我对行尾设置感到头痛。

上下文

根据我对git中的EOL管理的了解(如果/如果我做错了,请更正我),有两个关键领域可以解决此问题:

  • .gitconfig,其中core.autocrlfcore.eol设置了常规政策
  • .gitattributes,我可以在其中指定每个路径的eoltext属性。

this question中,我了解到设置core.autocrlf = true等同于设置core.eol = crlf并向每个文件添加text=auto属性;并且eol=属性会覆盖core.eol配置。

因此,我进行了一个小测试,以找出需要的选项。

我想要获得的东西和我尝试过的东西

在我的存储库中,我将有一些仅在Windows端使用的文件,一些仅在UNIX计算机上使用的文件以及两者将使用的源文件。 为避免头痛,我想将所有仅Windows文件设置为始终具有CRLF EOL,同时在提交时将其他所有内容转换为LF。

为此,我想在.gitattributes的行*.vcxproj eol=crlf text中进行设置。为了安全起见,出于安全考虑,我还考虑添加*.sh eol=lf text。最后,我想出了一个小测试,看它是否确实有效(Spoiler:无效)。

测试设置

我的目录树如下所示:

root_dir/
    - real.sh       (has LF EOL)
    - real.vcxproj  (has CRLF EOL)
    - fake.sh       (has CRLF EOL)
    - fake.vcxproj  (has LF EOL)

real.*文件具有其类型的“正确” EOL,fake.*具有其他类型。旨在检查将文件warning放入存储库时哪些文件引发git add

git config -l显示:

core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true

理想情况下,如果按照我的理解,一切正常,“假”文件会发出警告,提示将其转换为相反类型。

相反,会发生什么:

$ git add -A
warning: CRLF will be replaced by LF in fake.sh.
The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in real.vcxproj.
The file will have its original line endings in your working directory.

试图理解为什么会发生这种情况,看来转换采用了core.eol配置(在UNIX系统上默认为LF),而忽略了我在.gitattributes中指定的配置。 为了检验这个假设,我设置了core.eol = crlf,重新设置了索引,然后再次设置了git add -A,这次获得:

$ git add -A
warning: LF will be replaced by CRLF in fake.vcxproj.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in real.sh.
The file will have its original line endings in your working directory.

假设被证实,头痛加剧。为什么我的eol=...属性会被忽略?有没有一种方法可以按文件类型配置自动转换?如果可以,怎么办?

1 个答案:

答案 0 :(得分:0)

经过进一步测试,似乎一些不可见的字符最终出现在我的.gitattributes文件中,破坏了eol=...属性。通过cat "..." > .gitattributes生成文件解决了该问题。