Можно ли включить файл в ваш .gitconfig

245

Я хотел бы включить в мой файл .gitconfig файл с настройками github - возможно ли это?

Могу ли я сделать что-то вроде этого:

[core]
    include = /path/to/file
Дэвид Рейнольдс
источник
3
«Я не хочу включать в него детали github, поэтому я хотел бы как-то включить их из внешнего файла»: именно для этого и нужен глобальный конфигурационный файл. Есть ли причина не использовать его в вашем случае?
VonC
11
Да, потому что я хочу опубликовать .gitconfig в репозитории git и не хочу, чтобы кто-то украл мои учетные данные на github.
Дэвид Рейнольдс
Я не следую за вами: ваш обычный файл gitconfig будет опубликован на github, но без каких-либо настроек github. Зачем? Потому что они будут в вашем глобальном конфигурационном файле ( ~/.gitconfig), то есть не будут отправлены в репозиторий github. Когда вы набираете ' git config', вы видите соединение трех конфигурационных файлов (репо, глобальный и системный). Только файл конфигурации репо толкают. 2 других остаются местными.
VonC
90
похоже, все упустили суть этого вопроса. Очевидно, что Дэвид хочет создать репо всех своих точечных файлов (bashrc, gemrc и т. Д.), ВКЛЮЧАЯ свой .gitconfig, чтобы он мог иметь все свои настройки на всех своих машинах. Способ выдвинуть части файла .gitconfig путем включения и игнорирования личных записей - это то, что он (и я, если на то пошло) следует за
Бо Джинс
5
@bjeanes: точно! Я все еще не нашел способ сделать это все же.
Дэвид Рейнольдс

Ответы:

302

Git (1.7.10+) теперь поддерживает этот синтаксис в .gitconfig:

[include]
    path = /path/to/file

Смотрите здесь для подробного описания изменения git и его крайних случаев.

Кстати, пара тонкостей стоит отметить:

  1. Расширение переменной среды, например $HOME, не поддерживается. (Расширение ~появилось в Git 1.7.10.2.)

  2. Если указан относительный путь, то он относится к файлу .gitconfig с [include]оператором. Это работает правильно даже в цепочках включений - например, ~/.gitconfigможет иметь:

    [include]
        path = subdir/gitconfig
    

    и subdir/gitconfigможет иметь:

    [include]
        path = nested_subdir/gitconfig
    

    ... что приведет subdir/nested_subdir/gitconfigк загрузке.

  3. Если git не может найти целевой файл, он молча игнорирует ошибку. Похоже, что это по замыслу.

Майк Морарти
источник
7
на самом деле вам не нужно ~. это потому, что ваш .gitconfig-файл все еще должен находиться в ~/.gitconfigотносительном пути в конфигурации, что подразумевает ~...
robustus
2
Расширение ~/ на $HOMEсамом деле относится к git describe --contains 4c0a89fc-> v1.7.10.2~12^2(то есть v1.7.10.2или позже), примечательно, так как кажется, что Debian 7 и Ubuntu Quantal выпустят с v1.7.10.4.
FauxFaux
1
Это поддерживает globs? например, путь = ~ / gitconfig.d / *?
Брет
1
@ Нет, это не поддерживает глобусы.
Майк Морарти
8
Обратите внимание , что конфигурации включен этот путь не будет отображаться , когда конкретный файл дан (то есть, с --global, --localили --file), если не сказано явно с --includes(например git config --global --includes --list).
Франклин Ю
16

Обновление 2012:

См Mike Morearty «сек ответ :

Включает

Вы можете включить один файл конфигурации из другого, установив в специальной include.pathпеременной имя файла, который будет включен.
Включаемый файл раскрывается немедленно, как если бы его содержимое было найдено в месте расположения директивы include.
Если значение include.pathпеременной является относительным путем, путь считается относительным к файлу конфигурации, в котором была найдена директива include.
Значение include.pathподлежит расширению тильды: ~/расширяется до значения $HOMEи ~user/до домашнего каталога указанного пользователя.


Не думаю.

Я бы предпочел поместить эту настройку в ~/.gitconfigфайл

Пользовательский файл конфигурации. Также называется «глобальным» файлом конфигурации.

Таким образом, он завершает файл, специфичный для проекта .gitconfig, и не публикуется при отправке в GitHub. Смотрите также этот ответ SO для получения дополнительной информации о глобальном конфигурационном файле.
Git имеет 3 конфигурационных файла .


Bjeanes добавляет в комментариях:

похоже, все упустили суть этого вопроса.
Дэвид , очевидно , хочет , чтобы подтолкнуть вверх репо всех его точечных файлов ( bashrc, gemrcи т.д.) , включая его .gitconfigтак , что он может иметь все его настройки на всех своих машинах.
Способ выдвинуть части .gitconfigфайла путем включения и игнорирования личных записей - это то, за чем он (и я, если на то пошло) следует.

Один из возможных способов - использовать драйвер фильтра smudge / clean для дешифрования / шифрования одного файла с конфиденциальной конфиденциальной информацией (см. Эту ветку ), чтобы дополнить локальный файл, такой как ~ / .gitconfig, расшифрованными частями, относящимися к этому. файл.

Таким образом, у вас может быть Git-репо со всеми вашими точечными файлами, плюс один файл с зашифрованной информацией, предназначенный для расшифровки и добавления к указанным точечным файлам.

альтернативный текст

В .gitattributes(или .git/info/a..) использовании:

myPrivateInfosFile filter=gpg diff=gpg

В вашем репо-файле .config:

[filter "gpg"]
smudge = gpg -d -q --batch --no-tty
clean = gpg -ea -q --batch --no-tty -r C920A124
[diff "gpg"]
textconv = decrypt

( Решение на основе GPG означает, что вы, конечно, передали свои личные / открытые ключи другим способом на конечный компьютер, где вы хотите восстановить все свои точечные файлы путем клонирования этого специального репозитория)

На самом деле, в вашем случае сценарий smudge необходимо завершить так, как он должен, после расшифровки этого файла, продолжить и добавить соответствующие части в ваш глобальный ~/.gitconfigфайл (если вы не перезаписываете файл глобальной конфигурации другим местоположением ) или другие точечные файлы для этого иметь значение.

https://kerneltrap.org/mailarchive/git/2008/3/13/1153274/thread (неудобства gpg обсуждаются далее в этой теме ) (это отличается от использования полного зашифрованного репозитория Git, как описано здесь )

VonC
источник
5
Я хочу опубликовать свой основной файл .gitconfig в репозитории git, но я не хочу включать в него детали github, поэтому я хотел бы как-то включить их из внешнего файла.
Дэвид Рейнольдс
10

Вы можете загрузить его из командной строки:

$ git config --local include.path "/path/to/.gitconfig"

Используйте "$PWD"/.gitconfigвместо этого, если вы хотите загрузить файл из текущего каталога.

После выполнения вышеуказанной команды в ваш .git/configфайл добавляются следующие строки :

[include]
        path = /path/to/.gitconfig
kenorb
источник
2

Я полагаю, что вы можете сделать это с помощью инструмента-концентратора defunkt . Это оболочка для команды git, которая, помимо прочего, позволяет иметь GITHUB_USERи GITHUB_TOKENпеременные окружения. Который переопределит настройки в локальном .gitconfigфайле.

Затем, чтобы сделать его понятным для пользователя, на которого вы указали псевдоним alias git=hubв его конфигурации ZSH . После этого вы сможете найти локальный файл, в котором вы устанавливаете переменные среды, и перенести свой репозиторий в публичный мир со всей вашей личной информацией в такте.

** ПРИМЕЧАНИЕ для доморощенных пользователей на OSX, вы можете установить инструмент через brew install hub.

Джефф Ланотт
источник