.gitattributes 中的 `* text=auto` 和 `* text eol=lf` 有什么区别?

2023-11-24

我一遍又一遍地查看文档.gitattributes但我无法找到关于这两者之间有什么区别的明确答案:

* text=auto

* text eol=lf

Also is text=auto仅适用于*或者它也可以与特定的扩展一起使用?在这种情况下有什么区别?

*.txt text=auto

*.txt text eol=lf


TL;DR

在 Git 2.36.0 之前,eol=lf设置覆盖任何text设置,并且由于您已选择将其应用于每条路径,因此只有eol=lf如果您使用它,设置很重要。 Git 2.36.0 之后,eol=lf仅适用于text已设置、未指定或设置为autoGit 确定它是一个文本文件。

完整解释

让我们从这个开始并向外努力:

Also is text=auto仅适用于*或者它也可以与特定的扩展一起使用?

模式可以包括扩展。这text=auto部分是一个属性设置,并且模式选择将哪些属性应用于哪些文件。

Git 如何读取.gitattributes File

中的每一行gitattributes匹配或不匹配某些路径名,例如dir1/dir2/file.ext or README.md管他呢。作为gitattributes 文档 says:

中的每一行gitattributes文件的格式为:

pattern attr1 attr2 ...

也就是说,一个模式后跟一个属性列表,用空格分隔。前导和尾随空格将被忽略。以 # 开头的行将被忽略。以双引号开头的模式以 C 风格引用。当模式与相关路径匹配时,该行列出的属性将被赋予该路径。

Hence, * is the pattern。这些“模式”与.gitignore文件,但不允许使用负模式。因此,您可以使用类似的模式*.txt and *.jpg匹配文件扩展名或类似的模式dir1/*匹配特定目录中的文件。两个都.gitignore and .gitattributes文件也可以位于特定目录的本地,在这种情况下,它们适用于该目录及其子目录中的文件,但不适用于树中更高的路径。

现在,为了text vs text=auto,并且对于eol=lf无论是否,我们发现以下内容:

对于给定路径,每个属性可以处于以下状态之一:

Set
该路径具有特殊值“true”的属性;这是 通过仅列出属性名称来指定 属性列表。

Unset[细节被剪掉,但见下文]

设置一个值
路径具有指定字符串值的属性;这是 通过列出属性名称后跟等号来指定 符号 = 及其在属性列表中的值。

未指定
没有模式与路径匹配,也没有说明路径是否具有该属性,该路径的属性被称为“未指定”。

(在我看来,最后一个的措辞特别糟糕。它的真正意思是“所有匹配路径的模式”,没有人提到这个属性。)

So for text,属性为set,并且对于text=auto,属性为设置为一个值. The value本例中的部分是auto。由于图案是*,它适用于所有文件。

同样的逻辑也适用于eol=lf物品。如果,首先,这eol=lf出现在某种模式中,其次,该模式与有问题的文件匹配,然后eol属性被设置为一个值,该值为lf。由于您的建议行是* text eol=lf,这将使eol 设置为一个值,并且会使text set, but 未设置值.

如果你写成一个.gitattributes文件,该两行序列:

* text=auto
* text eol=lf

第二行的text覆盖第一个,所以text is set(但不是一个值)和eol is 设置为一个值,值为lf。两行都匹配,并且第二行覆盖第一行。

If you reverse两行:

* text eol=lf
* text=auto

然后又两条线都匹配但现在第二行只覆盖text设置,所以现在你有text set to auto and eol set to lf.

How the text属性适用于文件

下一节gitattributes 文档 says:

这个属性[text] 启用并控制行尾标准化... [如果是]

Set
...启用行尾标准化并将路径标记为文本文件...

Unset
...告诉 Git 不要在签入或签出时尝试任何行尾转换...

设置为字符串值“auto”
...如果 Git 判定内容是文本...

未指定
... Git 使用core.autocrlf配置变量...

(这意味着你必须去追寻git config文档找出什么core.autocrlf如果你离开的话text未指定)。

您已选择为每个文件设置它或将其设置为auto对于每个文件。前者的意思是“对每个文件进行转换”,后者的意思是“对每个文件进行转换”auto设置)意味着:嘿,Git,请帮我决定该文件是否是文本。如果您确定它是文本,请进行转换。

How eol=lf适用于文件

就在描述下方text设置是这个描述eol环境。在 Git 2.36.0 之前,它是这样的:

该属性设置要在 工作目录。它无需任何操作即可实现行尾转换 内容检查,有效设置text属性。

设置为字符串值“crlf”
... [剪断,因为你设置lf]

设置为字符串值“of”
此设置强制 Git 在签入时将行结尾标准化为 LF,并防止在签出文件时转换为 CRLF。

所以,如果你有eol=lf设置路径(并与*作为模式,它将被设置为every路径),Git 会将每个文件视为文本,并在“签入”时进行从 CRLF 行结尾到 LF 行结尾的转换(这再次表达得不好:转换实际上发生在git add步)。 Git 在签出期间不会执行任何操作(这也不是完美的措辞:转换(或者在本例中为非转换)发生在从索引提取到工作树的过程中)。

Git 2.36.0 之后,描述现在为:

此属性设置要在工作目录中使用的特定行结束样式。仅当设置或未指定文本属性时,该属性才有效,或者设置为自动时,文件将被检测为文本,并以 LF 结尾存储在索引中。
[为简洁起见,省略其余描述]

这意味着text现在考虑到eol。在你的情况下,你要么设置text或将其设置为auto。在第一种情况下eol属性始终适用于匹配模式。在第二种情况下,仅当 git 确定该文件是文本文件时才适用。

如果您使用不同的模式,您会得到不同的结果

请注意,如果您选择类似的模式*.txt,那么这些属性是set仅适用于与模式匹配的路径。对于其他路径,这些属性仍然存在unset。因此,你应该回顾一下文档看看当这些属性是时会发生什么unset.

当然,您可以这样做:

* -text
*.txt eol=lf

第一行将明确unset text在所有文件上,留下eol所有文件上均未指定。然后是第二行设置为一个值 eol=lf for *.txt文件,覆盖未指定的值。现在 Git 将应用eol=lf规则到名称匹配的所有文件*.txt,并使用未指定的 (eol and unset) 所有剩余文件的文本规则。

这个特别的-text语法是我上面剪掉的东西。使用text=false does not unset text,而是离开text设置为字符串值false。这与离开具有相同的效果text未指定(不具体unset)。使用-text赋予它特殊的unset环境。

之间的区别unset text and an 未指定 text就是那个时候text未指定,Git 可能会尝试guess(基于core.*设置如core.autocrlf) 是否进行转换。然而,当text具体是unset,Git 根本不会对该文件进行任何猜测或转换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.gitattributes 中的 `* text=auto` 和 `* text eol=lf` 有什么区别? 的相关文章

  • GitLab CI - 添加标签时避免构建

    添加 git 标签时如何防止触发 gitlab ci 管道 我在本地运行此命令 而不是在 gitlab ci 作业中运行 git tag a xyz 然后推送标签 这会触发各种管道 我想排除其中一些管道的运行 我正在尝试对诸如以下问题的想法
  • 为什么 git mergetool 说“没有文件需要合并”?

    我正在尝试将 BeyondCompare4 配置为 git 中的 difftool 和 mergetool 我使用的是 git 版本 2 5 0 windows 1 到目前为止 BeyondCompare4 作为 difftool 工作得很
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 签出现有的远程分支

    我见过不同的方法来检查现有的远程分支 假设我的朋友推送了新分支 bigbug 并且我想签出并将我的本地工作副本切换到该分支 我有以下选项 1 git checkout b bigbug origin bigbug 2 git checkou
  • 在 Windows 上将 Mercurial (hg) 存储库转换为 Git (7)

    我现在真的很沮丧 我有一个现有的 hg 存储库 其中有几个月的编码历史 我想将其放入私有 Github 存储库中 以便我可以从那里对其进行处理 不幸的是我使用的是 Windows 我似乎找不到any转换我实际上可以正常工作的存储库的方法 实
  • Git refs/remotes/origin/master 没有指向有效的对象

    在上次合并到 Git 存储库的 master 分支后 我失去了克隆存储库的能力 Cloning into test repository remote Counting objects 126084 done remote Compress
  • git 命令显示所有(轻量级)标签创建日期

    是否有一个衬垫可以向我显示所有 git 轻量级标签的创建日期 就像是 git show tags format date 我在这个发现link http osdir com ml git 2009 05 msg01404 html适合我需求
  • 从 master 更改为新的默认分支 git

    这是一个场景 我们有一个默认的分支 Master 我们以此为基础 创建分支并向上推等等 我们现在创建了一个Develop分支Master并将其设置为默认开发分支 我想知道的是 我现在如何知道我的 git pull 命令是否通过命令行请求默认
  • EGit(Eclipse git 插件)可以使用 SSH 密钥代替用户名和密码吗?

    我需要提交的 git 中央存储库是使用 SSH 密钥配置的 我的用户名是jmglov 但是当我执行 git 操作时 例如git clone 我使用这个配置 jmglov kitiara cat git config remote origi
  • Git 在推送代码时返回错误 403 [重复]

    这个问题在这里已经有答案了 一切都工作正常 直到我创建了一个新的 GitHub 帐户 当我尝试使用新帐户第一次将代码推送到 github 服务器时 出现以下错误 remote Permission to NEW USER NEW REPO
  • Git 中的合并冲突是由什么构成的?

    git 如何确定特定合并存在冲突以及冲突是什么 我的猜测是这样的 如果正在合并的两个提交有一个共同的父提交 并且如果它们都更改了父提交的 X 行 那就是冲突 让我的理解变得复杂的是 更改 X 行 可能意味着用几行新行替换它 但这仍然显示为一
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • 如何通过哈希显示提交的日期和时间

    I used git reflog识别我创建特定分支时的哈希值 我得到了哈希值fe1ddcdef 我还没有将此分支推送到远程 我现在正在尝试查找日期和时间fe1ddcdef发生 git reflog只告诉我 fe1ddcdef HEAD 1
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 如何在Windows上分离“Git bash”中启动的“git gui”?

    例如 我开始 git bash 我导航到某个目录 I start git gui 我关闭控制台窗口或按 Ctrl C Git gui 的窗口消失了 即使我用过git gui disown 即使当我按 Ctrl C 时它不在前台 如何正确分离
  • 如何升级 Windows 中 git svn 使用的 SVN 版本?

    我的公司正在将SVN升级到1 7 检查git svn version显示正在使用的SVN版本是1 4 6 我想获得 git svn 使用的 SVN 版本接近 1 7 但是 我没有看到有关更新 git svn 使用的 SVN 版本 在 Win
  • 是否可以在 git 存储库之外添加和提交文件?

    我们的文本文件分布在系统的各个角落 我们计划将这些文件中所做的所有修改添加到 git 存储库中 每次对这些文件进行修改都是由脚本进行的 因此 我们计划向该脚本添加新命令 以将文件添加到 git 存储库 但是 这些修改是同时进行的 我们可以为
  • 如何将 GIT 调用的输出获取到批处理脚本中的变量中?

    我有一个 git 命令来获取当前存储库的最新 SHA 如下所示 git log pretty format H n 1 我有一个 Windows 批处理脚本 我想按如下方式使用它 SET CURRENT SHA 但我不知道如何将从 git

随机推荐

  • 构建状态管理存储(ngrx/redux)。扁平代表数据,还是嵌套代表视图?

    我正在使用 ngrx 存储来维护应用程序状态 使用 normalizr 来展平来自 API 调用和 Immutable 的数据 到目前为止 它运行得非常好 但我正在处理一些更复杂的数据关系 我想知道如何继续构建商店 为了简化事情 我有两组对
  • Pandas 中的递归 SQL CTE 查询?

    如何优雅地将下面的递归 SQL 查询移植到 Pandas python 代码中 不知何故 如果不编写自己的递归函数 我就看不到一种直接的方法 Python 示例代码 import datetime import numpy as np im
  • Swift 过滤字典错误:无法将“[(_, _)]”类型的值分配给“[_ : _]”类型的值

    我正在尝试快速过滤字典 var data String String data data filter 0 1 Test 上面的过滤器代码在 Swift 2 下编译 但会产生以下错误 无法将 String String 类型的值分配给 St
  • Material Design 不设置警报对话框样式

    我已将 appCompat 材质设计添加到我的应用程序中 但警报对话框似乎没有使用我的主色 primaryDark 或强调色 这是我的基本风格
  • 如何在没有空终止符的情况下初始化 char 数组?

    char 数组是网络消息的一部分 其长度定义明确 因此不需要空终止符 struct Cmd char cmd 4 int arg struct Cmd cmd ABCD 0 this would be buffer overflow 如何初
  • 从公共类中的 AsyncTask 更新 UI 线程

    我试图将一些 AsyncTask 类拆分为公共 单独 函数 这样我就不必重写这么多代码 除了一个非常重要的方面之外 我几乎拥有了它 AsyncTask 函数通过对服务器进行 php 调用来编译 ArrayList 当此列表完成后 我需要更新
  • 使用 mod_remoteip 获取 Apache 2.4 访问日志以显示客户端 IP,而不是使用 Varnish 的 127.0.0.1

    在我的一生中 我无法让 mod remoteip 在我的 Apache 访问日志中获取客户端 IP 我正在使用在 Apache 2 4 7 之前安装的 Varnish 4 进行 Virtualmin 设置 你如何让它发挥作用 我终于在日志中
  • 将 event.target 与现有 jQuery 对象匹配

    我怎样才能做到这一点 event target返回一个 HTML 对象 我的元素是一个 jQuery 对象 除了比较 ID 或类之外 还有更好的方法来确定 event target my jquery object 吗 我想确保它是同一个对
  • 是否保证事件处理程序在调用 AJAX 回调之前完成?

    假设我有一个事件处理程序 它向服务器发出两次 AJAX 调用 foo click function get bar function alert Hello get baz function alert World 我意识到调用回调的顺序是
  • 双三次插值?

    我浏览了互联网 就双三次插值而言 我找不到一个简单的方程 维基百科关于该主题的页面不是很有帮助 那么有没有简单的方法来学习双三次插值的工作原理以及如何实现它 我用它来生成柏林噪声 但使用双线性插值对于我的需求来说是不稳定的 我已经尝试过 如
  • C++ 和表格格式打印

    我正在寻找如何在 C 中打印以便固定表列宽度 目前我已经使用空格和 and 但是一旦数字达到两位数 所有对齐都会变坏 NODE ORDER PARENT 0 0 1 7 7 2 1 0
  • 根据批处理中的 zip 文件重命名提取的文件

    我有多个 zip 文件 其名称例如 001 zip 002 zip 003 zip 并且有可能达到 999 zip 每个 zip 文件只有一个文本文件 我想使用 Batch 提取每个 zip 文件 然后将提取的文本文件重命名为 zip 的文
  • 矩阵组合逻辑

    注意 请阅读所有其他相关问题 这是我第一次和第二次尝试提出这个问题 确定测试矩阵结果的有效方法 笛卡尔积是最好的方法吗 问题是这样的 我有几个 比如 20 个 布尔验证 true false 所有布尔验证作为一个整体也有一个验证结果 我正在
  • PL/SQL 中的并行调用

    我有一个带有 proc 的包 它将执行许多其他过程 如下所示 CREATE PACKAGE BODY pkg IS CREATE PROCEDURE do IS BEGIN other pkg other proc other pkg2 o
  • 将自定义对象从 servlet 传递到 JSP

    我想将 Student 类型的自定义对象从 servlet 传递到 JSP 我创建了一个学生 bean 类 Student 包含 2 个属性firstname 和lastName 学生豆 import java io Serializabl
  • n个字符串的最长公共子串的Java实现

    我需要找到 n 个字符串的最长公共子串并在我的项目中使用结果 java中是否有任何现有的实现 库已经做到了这一点 关于什么并发树 这是一个小型 约 100 KB 库 可用于梅文中心 该算法使用组合Radix and 后缀树 众所周知 它有一
  • 使用按位运算求给定数字的平方根

    是否有一种算法可以使用按位运算求给定数字的平方根 有这段著名的代码魔法计算inverse平方根与一些非常聪明的小玩意 它被错误地归因于约翰 卡马克 这是更深入的挖掘进入它的起源 也许这就是你要问的 但我不建议使用它 在现代 CPU 上 它无
  • Java int 到 byte 的隐式转换

    我即将开始处理需要读取字节和创建字符串的事情 正在读取的字节表示 UTF 16 字符串 因此 为了测试一下 我想将 UTF 16 编码的简单字节数组转换为字符串 数组中的前 2 个字节必须表示字节顺序 因此必须是 0xff 0xfe 或 0
  • 告诉 gcc 专门展开循环

    我如何告诉 GCC 展开特定循环 我使用了 CUDA SDK 可以使用以下命令手动展开循环 pragma unroll gcc 有类似的功能吗 我用谷歌搜索了一下但找不到任何东西 GCC 8 获得了一个新的编译指示 允许您控制循环展开的方式
  • .gitattributes 中的 `* text=auto` 和 `* text eol=lf` 有什么区别?

    我一遍又一遍地查看文档 gitattributes但我无法找到关于这两者之间有什么区别的明确答案 text auto text eol lf Also is text auto仅适用于 或者它也可以与特定的扩展一起使用 在这种情况下有什么区