我正在使用Windows子系统的Linux git(版本2.17.1)来管理Windows笔记本电脑上的存储库,但这使我对行尾设置感到头痛。
根据我对git中的EOL管理的了解(如果/如果我做错了,请更正我),有两个关键领域可以解决此问题:
.gitconfig
,其中core.autocrlf
和core.eol
设置了常规政策.gitattributes
,我可以在其中指定每个路径的eol
和text
属性。从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=...
属性会被忽略?有没有一种方法可以按文件类型配置自动转换?如果可以,怎么办?
答案 0 :(得分:0)
经过进一步测试,似乎一些不可见的字符最终出现在我的.gitattributes
文件中,破坏了eol=...
属性。通过cat "..." > .gitattributes
生成文件解决了该问题。