尽管* text = auto,为什么GIT中的文本行结尾不统一

时间:2018-09-21 16:44:31

标签: java sql git

我正在研究现有GIT存储库的克隆,.gitattributes指定* text=auto !eol

根据我对文档的阅读,text = auto指定应在存储库中对所有“文本”文件进行规范化。

  

Git可以识别以ASCII或其超集之一编码的文件(例如   UTF-8,ISO-8859-1,...)作为文本文件

“归一化”表示LF仅作为行尾。

所以,我不知道如何检查混淆的仓库中的行尾,但是在工作区中,我混合了文本(.java / .sql文件)。有些带有LF,有些带有CRLF行尾。

由于.gitattributes的!eol表示未指定工作空间行结尾,因此我认为它们将与回购中的一样。

那么,为什么要混合使用?理想情况下,我想在回购和工作空间中使所有文本文件行都以LF结尾吗?

1 个答案:

答案 0 :(得分:3)

  

由于.gitattributes的 <ul> {items.children.map((channel, i) => ( (channel, i) => channel.url ? ( <a href={channel.url} target="_blank"> <FeaturedApps /> </a> ) : ( <FeaturedApps /> ) )} ))} </ul> 表示没有工作空间行结尾的规范,所以我认为它们将与回购中的一样。

是的,只是因为!eol当前已设置 并不意味着文件 已通过LF签入。仅仅因为使用LF检入文件并不意味着工作副本必须是LF。这只是意味着您签入的所有新内容都会在签入过程中从CRLF转换为LF ...,而不是工作副本!

因此,简而言之,您将获得CRLF和LF的混合,因为存储库包含CRLF和LF的混合。 text=auto所做的只是做到这一点,所以签入的 new 内容将在回购中为LF。

示例

这里是一个示例。

首先创建一个新的存储库并添加一个带有CRLF行尾的文本文件:

text=auto

此时,存储库中的文件和工作副本中的文件都具有CRLF。

我们现在将设置$ git init Initialized empty Git repository in /.../test/.git/ $ cat > file.txt line 1 line 2 $ unix2dos file.txt unix2dos: converting file file.txt to DOS format... $ git add file.txt $ git commit -m 'added file' [master (root-commit) f21d72f] added file 1 file changed, 2 insertions(+) create mode 100644 file.txt 。这不会更改文件或将其标记为脏文件。仍然是CRLF。

text=auto eol

我们可以删除文件并将其检出,但是由于存储库中的文件具有CRLF,因此我们在检出时仍会得到CRLF。

$ cat > .gitattributes
* text=auto !eol
$ git add .
$ git commit -m 'add .gitattributes'
[master 1844576] add .gitattributes
 1 file changed, 1 insertion(+)
 create mode 100644 .gitattributes
$ file file.txt  
file.txt: ASCII text, with CRLF line terminators
$ git status
On branch master
nothing to commit, working tree clean

现在让我们使用CRLF添加一个新文件。这将在存储库中标准化,但工作副本将不受影响。

$ rm file.txt
$ git checkout -- file.txt
$ file file.txt
file.txt: ASCII text, with CRLF, LF line terminators

即使此文件在存储库中为LF,在工作副本中为CRLF,该文件也不脏,再次检出将不会更改它。

$ cat > file2.txt
line 3
line 4
$ unix2dos file2.txt
unix2dos: converting file file2.txt to DOS format...
$ git add file2.txt
warning: CRLF will be replaced by LF in file2.txt.
The file will have its original line endings
in your working directory
$ git commit -m 'added file 2'
[master cc2c5c3] added file 2
 1 file changed, 2 insertions(+)
 create mode 100644 file2.txt
$ file file.txt file2.txt
file.txt:  ASCII text, with CRLF line terminators
file2.txt: ASCII text, with CRLF line terminators

我们可以通过删除 来获得LF版本,然后再次签出:

$ git status
On branch master
nothing to commit, working tree clean
$ git checkout -- file.txt file2.txt
$ file file.txt file2.txt
file.txt:  ASCII text, with CRLF line terminators
file2.txt: ASCII text, with CRLF line terminators

请注意,它现在有LF。

设置eol = lf不能修复您的存储库

$ rm file2.txt $ git checkout -- file2.txt $ file file2.txt file2.txt: ASCII text 设置仅在您的存储库包含正确的标准化文件开始时才有效。更改它不会修复我们的eol

file.txt

如何修复

解决问题并在所有地方获得LF的直接方法是在文件上实际运行$ cat >.gitattributes *.txt text eol=lf $ git commit -m 'set eol=lf' [master c9e346b] set eol=lf 1 file changed, 1 insertion(+), 1 deletion(-) $ rm file.txt $ git checkout -- file.txt $ file file.txt file.txt: ASCII text, with CRLF line terminators 。完成此操作并提交标准化文件后,结帐时到处都会有LF。