Где мне разместить глобальный файл gitattributes?

Насколько я понимаю, есть (несмотря на отсутствие документации) способ установить атрибуты Git глобально; но я не понимаю, куда поместить нужный gitattributes файл. В инструкциях говорится, что они относятся к

$(prefix)/etc/gitattributes

Но где $(prefix)? В частности, где это было бы для OS X (с Git в /usr/local/git/bin/git)? Альтернативно (или дополнительно) ~/.gitattributes работает?


person orome    schedule 19.01.2015    source источник
comment
В контексте Git «глобальный» обычно означает уровень пользователя; другими словами, параметр global влияет на все репозитории для одного конкретного пользователя. Напротив, параметр общесистемный влияет на все репозитории для всех пользователей машины. Какой уровень вам интересен? На уровне пользователя или в масштабе всей системы?   -  person jub0bs    schedule 19.01.2015
comment
@Jubobs: оба (то есть, где поставить один против другого; также, похоже, есть места для конкретной версии Git, если у одного установлено более одного Git, как я); но в основном для пользователя.   -  person orome    schedule 19.01.2015
comment
Для Windows см. Куда записывается git config --global?   -  person Michael Freidgeim    schedule 08.05.2016


Ответы (2)


Глобальные и общесистемные настройки

В терминологии вашего вопроса есть некоторая двусмысленность. В контексте Git «глобальный» обычно означает «пользовательский уровень»; другими словами, глобальный параметр влияет на все репозитории для одного конкретного пользователя (активного). Напротив, параметр общесистемный влияет на все репозитории для всех пользователей машины.

Gitattributes на уровне репозитория

(Я упоминаю это только для полноты.)

Согласно соответствующему разделу книги Pro Git,

Если вы хотите повлиять только на один репозиторий (то есть, чтобы назначить атрибуты файлам, которые относятся к рабочему процессу одного пользователя для этого репозитория), тогда атрибуты должны быть помещены в файл $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) в $ (prefix) / etc / gitconfig? за ответ. Если вы не присвоили prefix пользовательское непустое значение, $(prefix) по умолчанию не заменяется на ничего; следовательно, ваш общесистемный gitattributes файл должен находиться в /etc/.

person jub0bs    schedule 19.01.2015
comment
У меня есть каталог /usr/local/git/etc, который кажется уважаемым для gitattributes (по крайней мере, /usr/local/git/bin/git), но не /etc/git. Также есть каталог ~/.config/git, содержащий игнорирование, которое, похоже, сгенерировано GitHub). Мне не ясно, как все это сочетается друг с другом. - person orome; 19.01.2015
comment
@raxacoricofallapatorius Префикс, использованный для компиляции Git во время установки GitHub, мог быть /usr/local/git/; если так, /usr/local/git/etc/gitattributes будет вашим общесистемным gitattributes; см. раздел Общесистемные атрибуты gitattributes в моем ответе. Что касается ~/.config/git, это ваши глобальные gitattributes; см. раздел Глобальные (пользовательские) gitattributes в моем ответе. - person jub0bs; 19.01.2015
comment
Итак (для проверки) любой etc будет общесистемным (или, по крайней мере, общесистемным для данного Git), в то время как различные $XDG_CONFIG_HOME/git/... или ~/.configs/git/.. не будут иметь значения (и для gitignore), если я установил core.attributesfile (или core.excludesfile) на что-то другое . Например, если я установил его на /.gitattributes (viz. ~/.gitignore), это то, что будет использоваться для моих глобальных (пользовательских) настроек. - person orome; 19.01.2015
comment
@raxacoricofallapatorius Если я правильно вас понял, ответ - нет. Настройки уровня репозитория имеют приоритет над настройками уровня пользователя, которые имеют приоритет над общесистемными настройками. - person jub0bs; 19.01.2015
comment
Да, и репо-уровень их заменяет. Я проверял о глобальных объектах. - person orome; 19.01.2015
comment
@raxacoricofallapatorius Хорошо. Да. Путь по умолчанию для глобальных атрибутов gitattributes, $XDG_CONFIG_HOME/git/..., не будет использоваться, если вы переопределите его, задав для пользовательского пути значение git config --global core.attributesfile <path>. - person jub0bs; 19.01.2015
comment
Что касается $(prefix), обратите внимание, что ваш связанный вопрос означает, что prefix взят во время компиляции git, а не во время выполнения - person Tobias Kienzler; 04.08.2017

Если вы дочитали до этого места и все еще не знаете, где находится $prefix (т.е. он не просто пустой или /usr/local) или почему ваш /etc/gitattributes не читается, вы можете использовать strace или аналогичные инструменты, чтобы увидеть все места, которые проверяет git. Strace печатает огромное количество отладочной информации на stderr, поэтому используйте 2>&1 и фильтруйте его, как я делаю ниже, с помощью grep. Команда git, которую я выбрал для этого примера, использует файл атрибутов из-за --stat, который изменяется в зависимости от атрибута -diff, но любая команда git, которую вы пытаетесь запустить в то время, подойдет.

Например, с обновленным git, установленным на RHEL с использованием SCL, вы можете получить следующее:

$ 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)

. . . и это показывает, что префикс $ здесь /opt/rh/rh-git218/root/usr.

-f Strace здесь не обязателен, но если вы не знаете и не заботитесь о том, будет ли какая-то команда разветвляться, добавление -f в первую очередь может исключить вероятность того, что вы не увидите то, что ищете.

person jack-a-la-hg    schedule 20.01.2021