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

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

$(prefix)/etc/gitattributes

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

3 ответа

Решение

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

В терминологии вашего вопроса есть некоторая неопределенность. В контексте 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)?

Смотрите, что такое $(префикс) в $(префикс)/etc/gitconfig? за ответ. Если вы не назначены prefix пользовательское непустое значение, $(prefix) по умолчанию расширяется до нуля; следовательно, ваша система в целом gitattributes файл должен находиться в /etc/,

Если вы дочитали до этого места и до сих пор не знаете, где $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.

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

Вы также можете ссылаться на глобальную.gitattributeчерез новые переменные среды:

      git var GIT_ATTR_GLOBAL

В Git 2.42 (3 квартал 2023 г.) добавьте больше "" (man ) для разработчиков инструментов, чтобы они могли изучить различные местоположения Git, настроенные либо через конфигурацию, либо через жестко закодированные значения по умолчанию.

См. коммит 4db16f5 (27 июня 2023 г.) Джеффа Кинга ( peff) .
См. коммит ed773a1 , , коммит 15780bb, коммит cdd489e , коммит f74c90d , коммит 1e65721, коммит d6546af (27 июня 2023 г.) Брайана М. Карлсон ( bk2204) .
(Объединено Джунио К. Хамано -- gitster-- в коммите 89d62d5, 4 июля 2023 г.)

коммит 576a37fvar: добавить расположение файлов атрибутов

Подпись: Брайан М. Карлсон

В настоящее время существует несколько программ, которые хотели бы читать и анализироватьgitattributesфайлы на глобальном или системном уровне.
Однако не всегда очевидно, где находятся эти файлы, особенно для системного файла, который мог быть жестко запрограммирован во время компиляции или вычисляться динамически на основе префикса времени выполнения.

Неразумно ожидать, что все пользователи Git будут интуитивно знать, где дистрибьютор или пользователь Git настроил эти местоположения, поэтому добавьте несколько записей, чтобы мы могли определить их местоположение.
ЧестьGIT_ATTR_NOSYSTEMпеременная среды, если она указана.
Предоставьте функции доступа таким образом, чтобы мы могли повторно использовать их из кода var.

Чтобы сделать наши пути согласованными в Windows, а также использовать ту же форму, что и пути, используемые в «git rev-parse" (man ) , давайте нормализуем путь, прежде чем возвращать его.
В результате пути в стиле Windows используют косую черту, что удобно для обеспечения единообразной работы наших тестов на разных платформах.
Обратите внимание, что для этого требуется, чтобы некоторые из наших значений были освобождено, поэтому давайте добавим флаг, указывающий, нужно ли освобождать значение, и будем использовать его соответствующим образом.

git varтеперь включает в свою справочную страницу :

GIT_ATTR_SYSTEM

Путь к системному файлу linkgit:gitattributes[5], если он включен.

GIT_ATTR_GLOBAL

Путь к глобальному (для каждого пользователя) файлу linkgit:gitattributes[5].

Другие вопросы по тегам