什么是;“签出代码”;在git文档中,行尾是什么意思?

什么是;“签出代码”;在git文档中,行尾是什么意思?,git,gitattributes,core.autocrlf,Git,Gitattributes,Core.autocrlf,我真的很困惑下一页中的“签出代码”是什么意思: 如果您在Windows计算机上,请将其设置为true–这将在签出代码时将LF结尾转换为CRLF: 这是否意味着当您添加文件时?因为每当我将core.autocrlf从input更改为true,反之亦然,我在添加文件时看到的差异(“签出”是否意味着“添加”?): (注意:我试图回答一个潜在的问题,这似乎真的是:如果checkout意味着git checkout,为什么我会在git add期间收到这些消息?) 关于这一点的文档都有点草率,可能是故意的,

我真的很困惑下一页中的“签出代码”是什么意思:

如果您在Windows计算机上,请将其设置为true–这将在签出代码时将LF结尾转换为CRLF:

这是否意味着当您添加文件时?因为每当我将
core.autocrlf
input
更改为
true
,反之亦然,我在添加文件时看到的差异(“签出”是否意味着“添加”?):

(注意:我试图回答一个潜在的问题,这似乎真的是:如果checkout意味着
git checkout
,为什么我会在
git add
期间收到这些消息?)

关于这一点的文档都有点草率,可能是故意的,因为确切正确的细节有些模糊。为了从概念上更好地理解它,您应该将行尾修改视为更通用的污迹和干净过滤的一部分(因为这实际上就是它的实现方式)

在Git中,目前可以使用的每个文件都同时存在于三个位置:

the HEAD commit      the index       the work-tree
---------------      ---------       -------------
README.md            README.md       README.md
file.txt             file.txt        file.txt
文件可以在不同的方向上复制,除了所有提交在任何时候都是只读的。因此,您可以从头部提交复制到索引中,或从索引复制到工作树中。您还可以从工作树复制到索引中

(您还可以从索引进行新提交。这将保留旧的头提交,而新提交将成为头提交。因此,在进行新提交后,头提交和索引匹配。这不是因为我们修改了任何提交;我们不能这样做。这是因为我们添加了一个新提交,从索引进行,然后我们停止调用g旧的提交头部,并将新的称为头部。)

请注意,索引位于头和工作树之间。为了将任何文件从头复制到工作树,它必须首先通过索引。为了从工作树进行新提交,每个新文件都必须通过索引。因此,索引/工作树转换是进行清理和涂抹的地方

“清洁”文件意味着为提交做好准备。例如,此清理过程可以将CRLF行尾转换为仅限LF的行尾,或者编写自己的筛选器来执行几乎任何操作。涂抹文件意味着为编辑和/或在工作树中使用做好准备。例如,这可以将仅限LF的行尾转换为CRLF end与清理过程一样,您可以使用
ident
筛选器或您自己的筛选器驱动程序执行任何您想执行的操作。使用这些驱动程序交换短引用和整个文件内容

因此,确切的答案是,在将文件复制到索引中或从索引中复制出去的过程中,会应用行尾转换。最常见的是这两种转换:

  • git add
    将工作树中的副本复制到索引中
  • git checkout
    提取到工作树,从提交到索引然后到工作树,或者直接从索引到工作树
只有在这些时候,才会发生这些CRLF到LF或LF到CRLF的转换。但是Git有额外的代码,可以尝试直觉判断以后进行这些转换是否会导致对现有提交数据的更改,即使它还没有这样做。这些代码将向您显示警告消息:

warning: LF will be replaced by CRLF ...
warning: CRLF will be replaced by LF ...

如果您启用“安全crlf”选项,则会出现这些警告。因为它们来自不同的代码,在不同的时间运行,所以一切都可能非常混乱。

考虑一个图书馆。当您从图书馆签出一本书时,在您将其签回之前,其他用户无法访问该书

旧的集中式版本控制系统的工作原理与此类似;当您“签出”一个文件时,系统会锁定该文件,在您重新签入该文件之前,其他用户无法签出该文件

较新的版本控制系统倾向于允许多个用户同时处理一个文件,要求将不兼容的更改合并在一起,而不是严格地序列化对文件的访问。术语“签出”但仍用于指示将文件从存储库复制到工作目录的过程。

请注意,当
core.safecrlf
设置为
true
warn
时,这些文件在签出时并不总是有效,因为对于不使用CRLF作为行尾的内容,可能会错误触发

这已在Git 2.16(2018年第1季度)中修复

参见(2017年12月8日)和(2017年11月26日)作者。
(于2017年12月27日被合并)

convert
:拧紧安全autocrlf手柄 使用CRLF提交文本文件并提交该文件时 同样,如果
.gitattributes
具有“
text=auto

这是通过分析存储在索引中的blob的内容来完成的: 如果找到一个“
\r
”,Git会假定该blob是与CRLF提交的

对“
\r
”的简单搜索并不总是按预期工作:
文件使用CRLF以UTF-16编码并提交。Git将其视为二进制文件。
现在内容被转换成UTF-8 文件作为文本,CRLF应转换为LF,但不是

在索引()中有\u cru
替换为
在索引()中有\u crlf\u
。如果找不到“\r”, 直接返回0,这是最常见的情况。
如果找到“
\r
”,将对内容进行更深入的分析


如果您以前使用过任何类型的修订控制,“签出”是一个非常常见的术语。每当git更新工作树中的文件时,如在
git checkout
中。当您执行
git clone
时,它首先将repo复制到(.git目录),然后将相应的分支签出到工作树中。@Mort yes,通常使用“签出”,但VSS、SVN和Git都有
warning: LF will be replaced by CRLF ...
warning: CRLF will be replaced by LF ...