76

我收集有(尽管缺乏文档)一种全局设置Git 属性的方法;但我不清楚在哪里放置必要的gitattributes文件。说明他们属于

$(prefix)/etc/gitattributes

但在哪里$(prefix)?特别是,对于 OS X(带有 Git /usr/local/git/bin/git),它会在哪里?交替(或另外)会~/.gitattributes 起作用吗?

4

2 回答 2

106

全局与系统范围的设置

您的问题的术语有一些歧义。在 Git 上下文中,“全局”通常表示“用户级别”;换句话说,全局设置会影响一个特定用户(活动用户)的所有存储库。相反,系统范围的设置会影响机器所有用户的所有存储库。

存储库级 git 属性

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

根据Pro Git book 的相关部分

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

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

全局(用户级)gitattributes

根据Pro Git book 的相关部分

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

您还可以运行以下命令,

git config --global core.attributesfile <path>

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

系统范围的 git 属性

根据Pro Git book 的相关部分

系统上所有用户的属性都应该放在$(prefix)/etc/gitattributes文件中。

这自然引出了一个问题:

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

请参阅$(prefix)/etc/gitconfig 上的 $(prefix) 是什么?寻求答案。除非您分配prefix了自定义的非空值,否则$(prefix)默认情况下会扩展为空;因此,您的系统范围gitattributes文件应位于/etc/.

于 2015-01-19T15:07:30.360 回答
2

如果你读了这么远,仍然不知道在哪里$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在这里不是必需的,但如果您不知道也不关心某些命令是否会分叉,-f那么首先添加可以消除您看不到所需内容的机会。

于 2021-01-20T19:58:35.710 回答