我不使用 Windows,因此有点犹豫提出建议,但我可以在这里描述各种机制,并至少提出一些。:-)
转换文件数据的操作,包括修改行结尾的任何操作,在数据从存储库提取到工作树时应用(通常 - 有一些特定的例外) - 这基本上是git checkout
,但请参阅最后的注释-或添加到存储库中,基本上是git add
.
为了转换文件数据,Git 必须知道哪些文件被转换,哪些转换要应用。Git 必须对每个文件进行分类以决定要做什么。
有些文件显然是二进制文件,有些几乎可以肯定是文本,有些则相当模糊。Git 会猜测是否需要。你可以(我猜,也许,曾经不得不这样做?)通过设置or告诉它猜测,但请参阅下一段。core.autocrlf=true
core.autocrlf=input
如果你有一个.gitattributes
文件,你可以根据文件的路径名告诉 Git 文件,例如,*.txt
应该始终将其视为文本文件,而*.bin
文件不应视为文本文件。这为您提供了更好的控制,因为您不仅可以根据这样的路径名进行匹配,还可以编写以下任何一种:
*.ex1 text # definitely text
*.ex2 -text # definitely not text
*.ex3 text=auto # please guess for me based on file contents
# don't mention *.ex4: check core.autocrlf to decide whether to guess
仅基于这部分,我建议core.autocrlf
永远不要使用它,因为首先猜测似乎是可疑的。不过,至少text=auto
你有一个明显的地方要求猜测。
独立于猜测或确定,您可以列出eol=crlf
或eol=lf
在路径之后。git checkout
这可以进行转换,即在决定是否在提取 ( ) 和插入 ( )时弄乱行尾时,文件被视为文本git add
。在工作树中结束的是 CRLF 或 LF-only。在任何一种情况下,工作树中的 CRLF 在git add
. 我怀疑,但没有测试,这不会影响git diff
。
(旧crlf
的-crlf
、 和crlf=input
设置无疑应该不再使用,但如果您确实使用它们,它们的行为将按照文档中的gitattributes
描述进行。)
现在,您强调的一个明显问题是,使用-text
将文件标记为“从不使用 autocrlf 或其他猜测转换”与 交互git diff
,因为在产生差异之前git diff
还必须猜测文件是否为文本。在gitattributes
这里,我们可以回到文档,我们发现路径名可以有一个diff
属性:
*.ex5 -text diff # not text for crlf treatment, but text for diff
*.ex6 -text -diff # not text for either one
*.ex7 text -diff # definitely text for crlf, but binary for diff
*.ex8 diff=my-diff-driver # use my diff driver; no opinion about text
完全省略diff
会让 Git 猜测,就像它对 crlf 处理所做的那样。
请注意,路径名.gitattributes
不必是模式:您可以列出:
path/to/some/file -text
path/to/another/file text
以防 Git 猜错某些文件。
我还没有提到core.safecrlf
,但我认为文档中的git config
讨论在这里已经足够了。它由一系列在各种命令期间运行的特殊测试组成,提前在两个方向进行转换,最后的签出阶段转到一个临时文件,该文件立即被丢弃,只是为了查看工作树中的文件是否现在将保持他们现在的样子。也就是说,如果你现在做了,路径中的文件会改变内容吗?如果是这样,则转换不是“安全的”。git add path; git commit -m dummy; rm path; git checkout -- path
最后,我应该提几个特殊情况。文件从索引中出来的任何时候都会进行转换(行尾和涂抹过滤器);这包括命令git checkout-index
。它们也可以在绕过索引的操作期间故意完成:git cat-file
,通过添加--textconv
or--path=
或--filters
; git show
, 和--textconv
, 虽然细节会根据特定的 Git 版本而有所不同(其中许多选项不在旧版本的 Git 中)。类似地,转换(行尾和干净过滤器)在文件进入索引时随时完成,但也可以在git hash-object
、 使用--path
或中完成或抑制--no-filters
。