.gitattributes 文件对于 git 真的有必要吗?

2024-07-04

我最近读了一些关于 .gitattributes 的文章,也发现了像这样的地方,https://github.com/alexkaratarakis/gitattributes https://github.com/alexkaratarakis/gitattributes,他们尝试维护所有文件类型的 gitattributes。然而在我的脑海里,翻阅这些文件,我本能地认为这是一个无法维护的混乱。这意味着每当您使用任何新的文件扩展名或任何软件产生新的文件扩展名时,您都必须更新该文件,这是不可能的。当你与一个超过 30 人的团队一起工作时,维护这样的文件简直就是一场噩梦,我们几乎无法维护一个简单的 icon.svg 文件。

但除此之外,我多年来一直在许多不同的项目中编码和使用 git,但我从未使用过 .gitattributes。我们在项目中使用 prettier 之类的东西,将换行符重写为“lf”,并且我们在 Windows 上有开发人员,这样的东西永远不会出现任何问题,vscode 也永远不会出现任何此类问题。 Git 还会自动选取 png 等二进制文件,并自动显示 svg 等文件的文本差异,我从来不需要配置它。

所以我想问一下,这个文件真的有必要吗?因为在我看来,它正在签署大量完全没有必要的维护,而且 git 足够聪明,可以弄清楚它应该或不应该对文件做什么。


真的有必要拥有这个文件吗?

是的,对于与 Git 相关的任何设置(eol、diff、合并过滤器、内容过滤器……),您希望存储库的任何协作者都遵循。

这不同于git config出于安全原因,它仍然是本地的(因为它可能包含敏感信息或危险指令)

A .gitattributes是版本化源代码的一部分,有助于建立通用的 Git 标准。
例如,我总是把(如VonC/gitcred/.gitattributes https://github.com/VonC/gitcred/blob/main/.gitattributes):

*.bat   text eol=crlf
*.go    text eol=lf

因为无论你的 IDE/编辑器如何配置,我needCRLF 使我的 Windows bat 脚本能够正确运行,我更喜欢LF https://www.programming-books.io/essential/go/normalize-newlines-1d3abcf6f17c4186bb9617fa14074e48用于我在 Windows 或 Linux 上编辑的 Go 文件。我总是考虑本地设置,例如core.autocrlf反模式,最好留给false https://stackoverflow.com/a/2354278/6309.

But a .gitattributes可以声明许多其他 Git 元素:

  • , 用于翻译文件 https://github.com/BGforgeNet/bg2-tweaks-and-tricks/blob/e9ff1b7e618d0d909bd52c53b31258feef131ad9/.gitattributes
  • to 嵌入文件 SHA1 https://stackoverflow.com/a/1796675/6309 as in here https://github.com/Airamek/runit/blob/9272d0d150d4d83e4d10c706ce1ded0c2afd637c/src/runsvchdir.c#L9-L12=
  • ,最显着的是使用Git LFS https://git-lfs.github.com/, as in here https://github.com/Legorobotdude/Arcade-FPS/blob/f31c62c42cda5f10d0de419703963c8c471b5091/.gitattributes,我用过它many https://stackoverflow.com/a/44793610/6309 times https://stackoverflow.com/a/40317246/6309 before https://stackoverflow.com/a/67898483/6309.
  • ,至少避免比较二进制文件,或定义外部差异驱动程序 https://stackoverflow.com/a/53149114/6309
  • (using xfunname例如 https://github.com/ElenaKlatt/ChatApplication/blob/3227aa8d4896885fefaac0b32558b92d1d432468/.metadata/.plugins/com.aptana.portablegit.win32/doc/git/html/gitattributes.txt#L459-L467=):我提到他们在这里 https://stackoverflow.com/a/28111535/6309.
  • unityyamlmerge https://stackoverflow.com/a/64463933/6309
  • 定义什么diff and apply应该考虑空格错误
  • ...

The .gitattributesfile 不是“强制”的,而是 Git 工具箱中的一个有用工具,可以在项目代码库中安全地共享。


你甚至可以在裸存储库 https://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/:

在 Git 2.43(2023 年第 4 季度)中,属性子系统学会了遵守attr.tree指定读取哪棵树的配置.gitattributes文件来自.

See commit 9f9c40c https://github.com/git/git/commit/9f9c40cf34c29d4ad700d9869435d159056fa6fb, commit 2386535 https://github.com/git/git/commit/2386535511d1181afd4e892e2a866ffe5e1d7d21 (13 Oct 2023) by John Cai (john-cai) https://github.com/john-cai.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 26dd307 https://github.com/git/git/commit/26dd307cfaabe3d3f0b01aad64969e76a317811a, 30 Oct 2023)

attr https://github.com/git/git/commit/2386535511d1181afd4e892e2a866ffe5e1d7d21:裸仓库时从 HEAD 读取属性

Signed-off-by: John Cai

动机44451a2 https://github.com/git/git/commit/44451a2e5eec5360378be23e2cdbd9ecee49e14e (attr: 教 , 2023-05-06, Git v2.41.0-rc1 --merge https://github.com/git/git/commit/67a3b2b39f638872531324e03217fa58f7b9ad1e)(attr:教“--attr-source =”全局选项“git”,2023-05-06),是为了使其可以使用gitattributes与裸存储库。

为了更容易阅读gitattributes然而,在裸存储库中,我们只需制作HEAD:.gitattributes默认值。
这与邮件映射的工作方式一致,8c473ce https://github.com/git/git/commit/8c473cecfd8835c2bdf34b323e1b2de620099c04 ("mailmap:裸存储库中的默认 mailmap.blob”,2012-12-13,Git v1.8.2-rc0 --merge https://github.com/git/git/commit/3a3100a889cab5d3a1a590258304dacd188a17f6).

并且,仍然使用 Git 2.43(2023 年第 4 季度):

See commit 9f9c40c https://github.com/git/git/commit/9f9c40cf34c29d4ad700d9869435d159056fa6fb, commit 2386535 https://github.com/git/git/commit/2386535511d1181afd4e892e2a866ffe5e1d7d21 (13 Oct 2023) by John Cai (john-cai) https://github.com/john-cai.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 26dd307 https://github.com/git/git/commit/26dd307cfaabe3d3f0b01aad64969e76a317811a, 30 Oct 2023)

attr https://github.com/git/git/commit/9f9c40cf34c29d4ad700d9869435d159056fa6fb: add attr.tree用于设置要从中读取属性的树状结构

Signed-off-by: John Cai

44451a2 https://github.com/git/git/commit/44451a2e5eec5360378be23e2cdbd9ecee49e14e (attr: 教 , 2023-05-06, Git v2.41.0-rc1 --merge https://github.com/git/git/commit/67a3b2b39f638872531324e03217fa58f7b9ad1e) (attr: 教导“--attr-source=”全局选项“git”,2023-05-06)提供了传递树状结构作为 attr 源的能力。
然而,在像我们在 GitLab 那样将 Git 存储库作为裸存储库提供服务的情况下,更容易指出--attr-source通过设置一次即可将其设置为所有命令的 HEAD。

添加新配置attr.tree这允许这样做。

git config现在包含在其man page https://github.com/git/git/blob/9f9c40cf34c29d4ad700d9869435d159056fa6fb/Documentation/config/attr.txt#L1-L7:

attr.tree

对存储库中的树的引用,从中读取属性, 而不是.gitattributes工作树中的文件。

在一个光秃秃的 存储库,默认为HEAD:.gitattributes.

如果该值是 无法解析为有效的树对象,而是使用空树。
当。。。的时候GIT_ATTR_SOURCE环境变量或--attr-source使用命令行选项时,此配置变量无效。

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

.gitattributes 文件对于 git 真的有必要吗? 的相关文章

  • Git - 如何列出两次之间主分支上更改的所有文件? [复制]

    这个问题在这里已经有答案了 我想找出两个日期之间在主分支 或与此相关的任何一个分支 上修改的所有文件 我明白了 从这篇文章 如何仅列出两次提交之间更改的文件名 https stackoverflow com questions 155234
  • 发送特定文件夹的拉取请求?

    在一次提交中 我更改了多个文件夹中的多个文件 例如 folderA folderB and folderC In folderA这些更改只是添加注释和一些用于打印中间结果的代码 这符合我自己的理解 folderB folderC是新创建的
  • 从 git 中的旧提交恢复文件

    我有一个几周前做的旧承诺 我只想从该提交中恢复一个文件 我该怎么办 git checkout master 7 days ago path to file txt 这不会改变 HEAD 它只会覆盖本地文件path to file txt S
  • Git 恢复合并提交,丢失了一些文件

    所以我错误地合并了我的feature分支上release并推动 然后通过合并提交的反向提交将其恢复回来 一切都很顺利 尝试合并时出现问题release onto master 注意到一些丢失的文件和奇怪的变化 当腐败的合并实际上被推到我的身
  • 如何在不丢失 Git 中上次提交的情况下返回到上一个提交?

    这就是我想做的 我想回到之前的 2 个提交 也许将该提交中更改的文件作为新的提交返回 但我不想失去最后一次提交 我上次提交的代码中有一些错误 但我想暂时保留该错误 我读过一些文档 但没有一个文档清楚地说明了当你重置头部时会发生什么 例如 您
  • Git 将合并的提交一分为二

    我有这样的历史 3830e61 Add data escaping Bad 0f5e148 Improve function for getting page template aaf8dc5 Merge branch navigation
  • github 没有与名称关联的地址

    这些天我在 github 上一直遇到问题 我在 github 上创建了一个新的存储库 然后从本地计算机尝试将我的代码推送到 github git remote add origin email protected cdn cgi l ema
  • Windows 版 Git - 每次推送时都要求输入 SSH 密码

    我今天安装了 Windows 版 git 并做了一些测试 我发现每次推送时都会要求我输入密码 Linux 上不会发生这种情况 我对另一个线程提出了一些建议 我发现我没有配置 ssh agent 但我这样做了 问题仍然存在 有什么建议吗 谢谢
  • Git-Flow 撤消已完成的功能分支

    如果您想 撤消 功能分支 您有哪些选择 假设您添加了一项新功能supercool feature您完成后 合并到开发中并删除功能分支 然后进入发布版本 但你的用户真的不喜欢这个supercool feature 我如何撤消 倒回 反转这个已
  • github权限错误(ssh密钥无法识别)

    从另一个 本地 存储库推送到 github 帐户后 我似乎失去了对它的权限 我现在收到以下错误 git push Permission denied publickey fatal The remote end hung up unexpe
  • 从 git 安装时,我可以强制 pip 进行浅表签出吗?

    以下命令从 git 存储库安装 Python 包 pip install git ssh email protected cdn cgi l email protection username repo git Collecting git
  • 在 Mac 上缓存用于 git 签名的 GPG 密码

    关于这个主题已经有一个更通用的线程 签署 git 提交时记住 GPG 密码 https stackoverflow com questions 36847431 remember gpg password when signing git
  • 如何退出git中的提交编辑消息?

    我通常通过输入来提交git commit m initial 默认情况下 GNU nano 编辑器是 ubuntu Gnome 19 04 上 git config editor 中的选择 我不小心提交了我的更改输入git commit输入
  • 如何向 .gitignore 添加一些内容以使匹配不递归?

    如何添加一些东西到 gitignore这样匹配就不是递归的 例如 我想忽略目录foo和文件bar txt在当前目录中 但不在子目录中存在 我已经为我尝试过这个 gitignore file foo bar txt 但不幸的是 git 递归地
  • git with --git-dir= 导致“不是 git 存储库”

    我的一个 iOS 应用程序中有一个脚本 它应该获取 git 修订哈希并将其放入版本号中 在此脚本中 我运行 git git dir PROJECT DIR show s pretty format h 但是 我收到消息说该目录不是 git
  • 如何使用git中的标签来管理软件版本[重复]

    这个问题在这里已经有答案了 我们使用 git 来管理我们的项目 每个项目都有一个分支 开发者 分期 生产 我想使用 git 标签来管理软件的版本 据我所知 我是否在分支上并添加了一些提交 然后我必须运行 git标签1 0 将 1 0 替换为
  • Node.JS 执行 git 命令错误:权限被拒绝(公钥)

    问 我怎样才能跑步git push from node js with passphrase 我正在尝试构建一个需要运行的小模块git push from node js到远程repo 但是当我使用 from 时出现错误node js ex
  • .gitattributes 文件对于 git 真的有必要吗?

    我最近读了一些关于 gitattributes 的文章 也发现了像这样的地方 https github com alexkaratarakis gitattributes https github com alexkaratarakis g
  • 如何忽略`git stash -p`中添加的帅哥

    想象一下这个场景 edit two files git add p add hunks from one file 现在当你跑步时git stash p 它会再次询问您是否要隐藏您刚刚通过选择的帅哥git add p 有没有办法配置 git
  • 使用自定义 SSH 进行 Git 克隆,使用 GIT_SSH 错误

    我正在尝试使用自定义 SSH 命令克隆 Git 存储库 我设置SSH命令在GIT SSH环境中可变地运行 export GIT SSH usr bin ssh o StrictHostKeyChecking no i home me my

随机推荐