git 文档中关于行尾的“签出代码”是什么意思?

Mar*_* An 2 git gitattributes core.autocrlf

我真的很困惑以下页面中“签出代码”的含义:https : //git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#__code_core_autocrlf_code

如果您使用的是 Windows 计算机,请将其设置为 true – 这会在您检出代码时将 LF 结尾转换为 CRLF:

这是否意味着您添加文件时?因为每当我改变core.autocrlf来自inputtrue反之亦然,我在我的文件添加看differrence(不“退房”平均“添加”?):

> git config --global core.autocrlf true

> git add crlf-file.md

> git add lf-file.md
 warning: LF will be replaced by CRLF in lf-file.md.
 The file will have its original line endings in your working directory.

> git config --global core.autocrlf input

> git add crlf-file.md
  warning: CRLF will be replaced by LF in crlf-file.md.
  The file will have its original line endings in your working directory.
> git add lf-file.md
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 5

(注意:我试图回答潜在的问题,这似乎真的是:如果结帐意味着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
Run Code Online (Sandbox Code Playgroud)

文件可以在不同方向复制,除了所有提交始终是只读的。所以你可以从 HEAD 提交复制到索引中,或者从索引复制到工作树中。您还可以从工作树复制到索引中。

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

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

“清理”文件意味着准备好提交。例如,此清理过程可以将 CRLF 行尾转换为仅 LF 行尾。 或者,使用ident过滤器,您可以取消许多替换,或者编写您自己的过滤器来执行几乎任何操作。要涂抹文件手段,使其准备在工作树编辑和/或使用。例如,这可以将仅 LF 行结尾转换为 CRLF 结尾。与清洁过程一样,您可以使用ident过滤器或您自己的过滤器驱动程序来做任何您想做的事情。 Git LFS使用这些驱动程序来交换短引用和整个文件内容。

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

  • git add 从工作树复制到索引。
  • git checkout 提取到工作树,从提交到索引然后到工作树,或直接从索引到工作树。

这是只有在这些时候,任何这些CRLF到LF或LF到CRLF的转换发生。但是 Git 有额外的代码来尝试判断稍后进行这些转换是否会导致对现有提交数据的更改,即使它还没有完成。 代码将为您提供您看到的警告消息:

warning: LF will be replaced by CRLF ...
warning: CRLF will be replaced by LF ...
Run Code Online (Sandbox Code Playgroud)

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