我正在研究现有GIT存储库的克隆,.gitattributes指定* text=auto !eol
。
根据我对文档的阅读,text = auto指定应在存储库中对所有“文本”文件进行规范化。
Git可以识别以ASCII或其超集之一编码的文件(例如 UTF-8,ISO-8859-1,...)作为文本文件
“归一化”表示LF仅作为行尾。
所以,我不知道如何检查混淆的仓库中的行尾,但是在工作区中,我混合了文本(.java / .sql文件)。有些带有LF,有些带有CRLF行尾。
由于.gitattributes的!eol
表示未指定工作空间行结尾,因此我认为它们将与回购中的一样。
那么,为什么要混合使用?理想情况下,我想在回购和工作空间中使所有文本文件行都以LF结尾吗?
答案 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。
$ 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。