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

Where should I place my global 'gitattributes' file?

我收集到(尽管缺少文档)a way to set Git attributes globally; but I'm not clear where to place the necessary gitattributes file. The instructions说他们属于

$(prefix)/etc/gitattributes

但是 $(prefix) 在哪里?特别是,对于 OS X(Git 在 /usr/local/git/bin/git 中)它会在哪里?或者(或另外) ~/.gitattributes work?

全局设置与系统范围设置

您问题的术语有些含糊。 在 Git 上下文中,"global" 通常表示 "user-level";换句话说,global 设置会影响 one 特定用户(活动用户)的所有存储库。相比之下,系统范围 设置会影响机器的所有 用户的所有存储库。

存储库级别的 gitattributes

(我只是为了完整性才提到这一点。)

根据 relevant section of the Pro Git book,

If you wish to affect only a single repository (i.e., to assign attributes to files that are particular to one user’s workflow for that repository), then attributes should be placed in the $GIT_DIR/info/attributes file.

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

全局(用户级)gitattributes

根据 relevant section of the Pro Git book,

Attributes that should affect all repositories for a single user should be placed in a file specified by the core.attributesfile configuration option [...]. Its default value is $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/attributes is used instead.

您也可以运行以下命令,

git config --global core.attributesfile <path>

将 Git 指向全局 gitattributes 文件的自定义路径 <path>,例如~/.gitattributes.

系统范围的 gitattributes

根据 relevant section of the Pro Git book,

Attributes for all users on a system should be placed in the $(prefix)/etc/gitattributes file.

这自然引出了一个问题:

[...] But where is $(prefix)?

请参阅 What is $(prefix) on $(prefix)/etc/gitconfig? 以获得答案。除非您为 prefix 分配了一个自定义的非空值,否则 $(prefix) 默认情况下会展开为空;因此,您的系统范围 gitattributes 文件应位于 /etc/.

如果你读到这里仍然不知道 $prefix 在哪里(即它不仅仅是空白或 /usr/local)或者为什么你的 /etc/gitattributes 没有被阅读,你可以使用 strace 或类似的工具来查看 git 正在检查的所有地方。 Strace 在 stderr 上打印了大量的调试信息,所以使用 2>&1 并过滤它,正如我在下面所做的那样,使用 grep。我为示例选择的 git 命令使用属性文件,因为 --stat 会根据 -diff 属性更改,但是您尝试使用的任何 git 命令 运行到时候应该没问题。

例如,使用 SCL 在 RHEL 上安装更新的 git,您可能会得到这样的结果:

$ 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 可以消除您的机会不会看到您要查找的内容。