.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` 有什么区别? 的相关文章

  • 配置 Eclipse/EGit 来跟踪上游存储库

    我正在使用 EGit 如新的 Eclipse 4 2 Juno 版本中提供的 我在 GitHub 上有一个存储库 是从另一个上游存储库分叉的 当我从 Github 上的存储库在 Eclipse 中创建项目时 它正确设置origin指向 Gi
  • Visual Studio 2017/2019/2022 gitsync/pull/push/fetch 操作卡住,并且无法停止

    我从 Visual Studio 中的 Git Changes 选项卡启动同步 获取 拉取或推送 但操作只是挂起 没有选项可以停止它 我必须点击 X 才能关闭 Visual Studio 如果操作是同步的 它会在其他所有操作上打开一个模式对
  • 通过 cron 进行 git 推送

    我正在尝试运行git push来自 cron 当我在 shell 上以交互方式执行命令时 一切顺利 从我的用户的 crontab 运行命令时 cron 会传递错误消息 Permission denied publickey 我认为这与查找或
  • 本地 git 存储库强制从远程 git 存储库更新。 (胖客户端部署)

    Update 我认为这与 Windows git 客户端 msysgit 的问题有关 抱歉打扰你们了 我正在寻找一种方法来使多个客户端框与远程 git 存储库保持同步 强制从远程存储库进行更新并放弃客户端上可能已更改的任何内容 我遇到的问题
  • 如何将 GitHub PR 的代码与其他分支的 PR 代码分开?

    我正在开发一个项目并解决问题 我正在为每个拉取请求 PR 创建一个不同的分支 上次我用他们的 PR 创建了两个不同的分支并解决了这两个问题 现在的问题是 我的两个拉取请求都与我在不同分支上推送的代码搞乱了 我借助以下命令在 git bash
  • 我如何知道哪些文件已在 git 中标记为“假设未更改”

    这个答案 https stackoverflow com a 936325 554807向您展示如何将 git 管理的文件标记为 我不希望从该文件的存储库进行更改 IE 拥有该文件的您自己的本地未跟踪版本 即使它仍然受到 git 的修订控制
  • 我的终端中的彩色、并排、内联 git diff 输出

    请注意 此问题不是该问题的重复问题 而是该问题的后续问题 当我执行 git diff 时 如何获得并排差异 https stackoverflow com questions 7669963 how can i get a side by
  • Git 择优挑选然后 rebase

    当我在 git 中挑选樱桃后进行 rebase 时 有一些我不明白的事情 有人可以告诉我发生了什么事吗 场景是这样的 我正在主分支和主题分支上工作 如下所示 该主题有两次提交 C D topic A B master 我的主题分支有问题 所
  • 错误:无法锁定引用..“引用/标签”存在;无法创建“参考/标签/”

    当我尝试从 github 中提取更改时 出现奇怪的 无法锁定引用 错误 我尝试过 git gc 并查找类似的错误 但找不到解决方案 gt git pull error cannot lock ref refs tags v2 8 refs
  • 删除 git Branch -a 列出的分支

    命令git branch a列出了一堆不在存储库上且不在本地分支上的分支 这些怎样才能删除呢 develop master remotes origin cloner 例如 remotes origin cloner曾经存在于存储库中 但它
  • Git在Windows中的克隆比在Linux中慢得多

    我一直在追寻 Windows 上 github 克隆速度极慢的问题 Linux kali 没有这个问题 我的下行连接速度为 100 40 megabit s 我可以获得接近 8mb s 的下载速度 没有问题 我已将电脑直接插入互联网插座 无
  • GitLab 是否通过 git-annex 或其他方式支持大文件?

    我运行一个 GitLab 实例 并希望允许我的用户上传几乎任何大小的文件 众所周知 git 在处理大文件方面仍然存在问题 我知道通过将文件存储在其他地方并仅对元数据进行版本控制来规避此问题的方法 例如git annex git media
  • Google App Engine 和 Git 最佳实践

    我正在 Google App Engine 上开发一个小型宠物项目 我想使用以下命令将源代码置于源代码控制之下github http www github com 这将允许我的朋友检查和修改源代码 我只有一个PetProject包含所有源的
  • 关闭 Sublime Text 3.2 中的 git 集成

    如果我想关闭 Sublime text 左侧装订线中的 GIT 集成 又名史莱姆绿线 我只需将其切换为 false 26 show git status false 但是 当在首选项中进行设置时 我收到错误 尝试解析设置时出错 意外的字符
  • 如何使用git查看指定版本的Webkit?

    谢谢 从链接http trac webkit org wiki UsingGitWithWebKit http trac webkit org wiki UsingGitWithWebKit 使用 git 检查 Webkit 有以下 3 个
  • 在 Windows 上为 Bitbucket 设置 SSH 密钥

    首先 我对 git repos 和命令行绝对是菜鸟 我在 Bitbucket 上有仓库 我基本上希望能够通过 gitbash 推送到存储库 而无需每次输入密码 我拥有的 Bitbucket 上的存储库已设置好代码 克隆存储库的本地目录 通过
  • git receive-pack 以 0000 停止

    我对 git 很陌生 目前正在尝试在 opensuse 上使用 gitolite 和 trac 设置环境 我设法使用来自的脚本迁移旧的 svn 存储库http john albin net git git svn migrate http
  • GIT Rebase 协作的分支?

    阅读本文后 重新设置基点以收集从主分支到我的功能分支的更改是有意义的 Git 工作流程以及 rebase 与合并问题 https stackoverflow com questions 457927 git workflow and reb
  • 将远程存储库导入为具有完整历史记录的子目录

    我想将远程存储库作为具有完整历史记录的子目录进行合并和解耦 有多种方法和问题可以实现这一点 我的第一次尝试是使用subtree但它似乎没有重写文件的历史记录 所以我无法查看合并存储库的历史记录 接下来的尝试是手动合并它 就像 Seth Ro
  • git 可以知道你当前的分支是从哪个分支分支出来的吗?

    我想创建一个 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仅适用于 或者它也可以与特定的扩展一起使用 在这种情况下有什么区