我应该把全局的'gitattributes'文件放在哪里?

84

我了解到尽管缺乏文档,仍然有一种方法可以全局设置Git属性;但是我不清楚在哪里放置必要的gitattributes文件。说明说它们应该放在

$(prefix)/etc/gitattributes

但是$(prefix)在哪里?特别是在OS X上(使用/usr/local/git/bin/git中的Git),它会在哪里?或者(或者还有)~/.gitattributes work吗?


3
在Git的上下文中,“global”通常意味着“用户级别”,换句话说,“全局”设置会影响一个特定用户的所有存储库。相比之下,“系统范围”的设置会影响机器上所有用户的所有存储库。你感兴趣的是哪个级别?用户级别还是系统范围级别? - jub0bs
@Jubobs:两者都是(即放置一个与另一个的位置;如果有多个Git安装,还似乎有特定于Git版本的位置),但主要是为用户。 - orome
对于Windows,请参见git config --global写入哪里? - Michael Freidgeim
3个回答

117

全局设置与系统范围设置的区别

你的问题术语有些模糊。在Git上下文中,“全局”通常意味着“用户级别”; 换句话说,全局设置会影响到一个特定用户(当前用户)的所有存储库。相比之下,系统范围设置会影响到机器上所有用户的所有存储库。

存储库级gitattributes

(我只是为了完整性而提及这个。)

根据《Pro Git book》的相关部分所述,

如果您只想影响单个存储库(即为该存储库分配特定于某个用户工作流程的文件属性),则应将属性放置在$GIT_DIR/info/attributes文件中。

$GIT_DIR通常会扩展为<path-to-repo-root-directory>/.git

全局(用户级别)gitattributes

根据《Pro Git》书中相关章节的说明,

应该影响单个用户所有存储库的属性应放置在由core.attributesfile配置选项指定的文件中[...]. 它的默认值是$XDG_CONFIG_HOME/git/attributes. 如果$XDG_CONFIG_HOME未设置或为空,则使用$HOME/.config/git/attributes

您也可以运行以下命令,
git config --global core.attributesfile <path>

要将 Git 指向自定义路径 <path> 以获取全局 gitattributes 文件,例如 ~/.gitattributes,您需要进行以下操作。

系统级 gitattributes

根据 Pro Git 书籍 的相关章节,

所有用户的属性应该被放置在 $(prefix)/etc/gitattributes 文件中。

这自然引出了一个问题:

[...] 但是 $(prefix) 在哪里?

请参见 $(prefix)/etc/gitconfig 上的 $(prefix) 是什么? 获取答案。除非您给定了自定义的非空值,否则默认情况下 $(prefix) 不会展开任何内容;因此,您的系统级 gitattributes 文件应该位于 /etc/ 中。

我有一个/usr/local/git/etc目录,似乎被gitattributes所尊重(至少被/usr/local/git/bin/git所尊重),但没有/etc/git。还有一个~/.config/git目录,其中包含GitHub似乎生成的忽略文件。我不清楚所有这些如何配合使用。 - orome
@raxacoricofallapatorius 在 GitHub 安装期间编译 Git 使用的前缀可能是 /usr/local/git/;如果是这样,那么 /usr/local/git/etc/gitattributes 将是您的系统范围 gitattributes;请参阅我的答案中的系统范围 gitattributes 部分。至于 ~/.config/git,那是您的全局 gitattributes;请参阅我的答案中的全局(用户级)gitattributes 部分。 - jub0bs
1
所以,如果要检查任何etc是否为系统范围内(或者至少是特定 Git 的系统范围内),而各种$XDG_CONFIG_HOME/git/...~/.configs/git/..则无关紧要(对于gitignore也是如此)如果我已经将core.attributesfile(或core.excludesfile)设置为其他内容。例如,如果我将它设置为/.gitattributes(即~/.gitignore),那么它就会用于我的“全局”(用户级)设置。 - orome
如果我理解正确的话,答案是否定的。存储库级别的设置优先于用户级别的设置,后者又优先于系统范围的设置。 - jub0bs
@raxacoricofallapatorius 好的。是的。如果你使用 "git config --global core.attributesfile <path>" 来设置自定义路径,那么全局 gitattributes 的默认路径 "$XDG_CONFIG_HOME/git/…" 将不再使用。 - jub0bs
显示剩余2条评论

4
如果你一直读到这里还是不知道 $prefix 在哪(也就是不只是空白或 /usr/local),或者为什么你的 /etc/gitattributes 没被读取,你可以使用 strace 或类似的工具来查看 git 正在检查的所有地方。 Strace 会在 stderr 上打印大量的调试信息,所以像下面示例中那样使用 2>&1 并用 grep 过滤它即可。我选择了一个带有 attributes 文件的 git 命令作为示例,因为它使用了 --stat,该选项会基于 -diff 属性进行更改,但你试图运行的任何 git 命令都应该没问题。
例如,在使用 SCL 安装更新的 git 的 RHEL 上,你可能会得到这样的结果:
$ strace -f git log --stat -1 2>&1 | grep --color 'open.*attr'
open("/opt/rh/rh-git218/root/usr/etc/gitattributes", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/username/.config/git/attributes", O_RDONLY) = -1 ENOENT (No such file or directory)
open(".gitattributes", O_RDONLY)        = -1 ENOENT (No such file or directory)
open(".git/info/attributes", O_RDONLY)  = -1 ENOENT (No such file or directory)

这表明在此处$prefix是/opt/rh/rh-git218/root/usr

在这里,Strace的-f并不必要,但如果你不知道或者不关心某个命令是否会fork,最好一开始就添加-f以避免错过所需查看的内容。


1
您还可以通过新的环境变量引用全局的 .gitattribute 文件。
git var GIT_ATTR_GLOBAL

在 Git 2.42(2023 年第三季度)中,为工具开发人员增加更多 "git var"(man),以便了解 Git 配置的各个位置,无论是通过配置还是硬编码的默认值。

查看提交 4db16f5(2023年6月27日)由Jeff King(peff进行。
查看提交 ed773a1, 提交 576a37f, 提交 15780bb, 提交 cdd489e, 提交 f74c90d, 提交 1e65721, 提交 d6546af(2023年6月27日)由brian m. carlson(bk2204进行。
(由Junio C Hamano -- gitster --合并于提交 89d62d5,2023年7月4日) var:添加属性文件位置 Signed-off-by: brian m. carlson
目前,有一些程序希望在全局或系统级别读取和解析gitattributes文件。
然而,这些文件的位置并不总是明显的,特别是对于系统文件来说,它可能已经在编译时硬编码或根据运行时前缀动态计算得出。

我们不能指望所有调用Git的用户都能直观地知道Git分发商或用户配置这些位置的方式,因此添加一些条目以便我们确定它们的位置。
如果指定了GIT_ATTR_NOSYSTEM环境变量,则遵循该变量。
以一种可以从var代码中重用它们的方式公开访问器函数。

为了使我们的路径在Windows上保持一致,并且使用与“git rev-parse”(man)中使用的路径形式相同,让我们在返回路径之前对其进行规范化。
这将导致使用斜杠的Windows风格路径,这样可以方便地使我们的测试在各个平台上以一致的方式运行。
请注意,这需要释放一些值,因此让我们添加一个关于是否需要释放该值的标志,并相应地使用它。

git var现在在其man page中包含以下内容:

GIT_ATTR_SYSTEM

系统linkgit:gitattributes[5]文件的路径,如果启用了该文件。

GIT_ATTR_GLOBAL

全局(每个用户)linkgit:gitattributes[5]文件的路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接