.gitattributes文件对git来说真的是必需的吗?

zlwx9yxi  于 11个月前  发布在  Git
关注(0)|答案(2)|浏览(183)

我最近阅读了一些关于.gitattributes的内容,也发现了像https://github.com/alexkaratarakis/gitattributes这样的地方,他们试图为所有文件类型维护gitattributes。然而在我看来,浏览这些文件,我本能地认为 * 这是一个不需要维护的混乱 *。这意味着你必须在任何时候更新这个文件,你使用任何新的文件扩展名,或者任何软件带来了新的文件扩展名,这是不可能的。当你和一个30多人的团队一起工作时,维护这样的文件简直是一场噩梦,我们几乎不能维护一个简单的icons.svg文件。
但沿着,我已经在许多不同的项目中编码和使用git很多年了,我从来没有使用过. gitattributes。我们在我们的项目中使用了prettier这样的东西,它将换行符重写为“lf”,我们在windows上有开发人员,这样的东西从来没有任何问题,vscode也从来没有给出任何这样的问题。Git还自动拾取二进制文件,如pngs,并自动显示文件的文本差异比如svg,我从来不需要配置它。
所以我问了一个问题,有这个文件真的有必要吗?因为在我看来,它注册了大量完全不必要的维护,而git足够聪明,可以弄清楚它应该或不应该对文件做什么。

gc0ot86w

gc0ot86w1#

真的需要这个文件吗?
是的,对于任何与Git相关的设置(eol,diff,merge filters,content filters,.),你希望仓库的任何协作者都能遵循。
这与git config不同,出于安全原因,git config仍然是本地的(因为它可能包含敏感信息或危险指令)
.gitattributes是版本化源代码的一部分,有助于建立通用的Git标准。
例如,我总是写(如VonC/gitcred/.gitattributes):

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

字符集
因为无论IDE/编辑器是如何配置的,我都需要 * CRLF才能正常运行Windows bat脚本,而对于在Windows或Linux上编辑的Go文件,我更喜欢使用LF。我一直认为像core.autocrlf这样的本地设置是反模式,best left to false
但是.gitattributes可以声明许多其他Git元素:

.gitattributes文件不是“强制性的”,而是Git工具箱中的一个有用工具,可以在项目代码库中安全地共享。
你甚至可以在**bare repositories**中阅读它:
在Git 2.43(2023年第4季度)中,属性子系统学会了荣誉attr.tree,该配置指定从哪个树读取.gitattributes文件。
参见commit 9f9c40ccommit 2386535(2023年10月13日)by John Cai ( john-cai )
(由Junio C Hamano -- gitster --合并于commit 26dd307,2023年10月30日)

attr:裸仓库时从HEAD读取属性

签字人:John Cai
44451a2attr:teach,2023-05-06,Git v2.41.0-rc 1--merge)(attr:teach“--attr-source=”global option to“git”,2023-05-06)的动机是使gitattributes与裸存储库一起使用成为可能。
但是,为了更容易地读取裸存储库中的gitattributes,让我们将HEAD:.gitattributes设置为默认值。
这与邮件Map的工作方式一致,8c473ce(“mailmap:default mailmap.blob in bare repositories”,2012-12-13,Git v1.8.2-rc 0--merge)。
Git 2.43(Q4 2023):
参见commit 9f9c40ccommit 2386535(2023年10月13日)通过John Cai ( john-cai )
(由Junio C Hamano -- gitster --合并于commit 26dd307,2023年10月30日)

attr:增加attr.tree,用于设置读取属性的树型

签字人:John Cai
44451a2attr:teach,2023-05-06,Git v2.41.0-rc 1--merge)(attr:teach“--attr-source=”global option to“git“,2023-05-06)提供了传入treeish作为attr源的能力。
然而,在像我们在GitLab中所做的那样将Git存储库作为裸存储库提供服务的情况下,通过设置一次将--attr-source指向HEAD以用于所有命令会更容易。
添加一个新的配置attr.tree,允许这一点。
git config现在在其手册页中包括:

attr.tree

对存储库中要从中读取属性的树的引用,而不是工作树中的.gitattributes文件。
在裸存储库中,默认值为HEAD:.gitattributes
如果该值没有解析为有效的树对象,则使用空树。
当使用GIT_ATTR_SOURCE环境变量或--attr-source命令行选项时,此配置变量无效。

nnt7mjpx

nnt7mjpx2#

视情况而定。.gitattributes文件最常见的用途是行结束处理,工作树编码和Git LFS。如果您使用Git LFS,则需要将这些文件作为LFS文件处理。
否则,如果您只关心行结束符,则取决于您的平台。如果您的项目仅限Unix,则不需要它。但是,如果您的项目可能跨系统使用,则通常需要一个指示哪些文件是文本的文件(也就是说,应该受到行结束转换)和哪些不是。Git确实经常正确猜测,但它只看文件的开头,在许多情况下,某些文件类型(特别是PDF)以一大块ASCII兼容文本开始,然后包含二进制数据,Git将需要帮助。
如果你想包含shell脚本或批处理文件,你绝对需要一个.gitattributes文件,因为POSIX shell不接受CR作为行尾的一部分,而批处理文件必须包含CRLF。因此,eol=lfeol=crlf是可重现的行为所必需的。
同样,Windows上的一些人拥有现代没有的工具(我们绝大多数使用UTF-8),并且仍然绝对要求它们的数据在BOM中使用小端UTF-16。对于这些程序,通常工作树编码很重要,这样Git会在内部将它们存储为UTF-现在的大多数编辑器和工具都可以很好地处理UTF-8和LF,这可能就是为什么你没有真正看到问题的原因。
如果你的项目将在Windows上使用,我强烈建议至少使用一个简单的* text=auto,因为这意味着人们不会意外地在你的文本文件中提交CRLF行尾,而且人们在跨系统工作时会有他们喜欢的行尾。这是一个简单的步骤,可以让你的项目体验更好。

相关问题