Git обновился. Добавилась очень интересная фича: conditional includes для конфигов. Самый простой пример, зачем это нужно, это разные настройки пользователя (имя и почта) для разных проектов. Можно рабочие репозитории держать в ~/work
, а остальное в ~/pleasure
(зачем в такой директории держать репозитории не очень ясно, но для примера это нужно). И для разных директорий подключать разные конфиги.
Сначала я подумал, что это бред. Ну нафига иметь на 99% одинаковые конфиги, отличающиеся только пользователем? Ведь нет же смысла иметь разные алиасы или другие настройки. Неправда моя. Смысл есть. И работает все немножко не так.
Подключаемый файл раскрывается сразу в том месте, где его подключили. Что будет, если в конфигах есть одинаковые блоки с разным определением одинаковых алиасов? Самое время пересобрать гит и проверить!
[master ✓] $ git --version
git version 2.13.0
Имеем следующую конфигурацию:
[master ✓] $ ls -a ~ | grep gitconfig
.gitconfig
.gitconfig-test
[master ✓] $ cat ~/.gitconfig-test
[alias]
st = status
[master ✓] $ cat ~/.gitconfig
...
[includeIf "gitdir:~/"]
path = ~/.gitconfig-test
[alias]
st = status -sb
...
Важно, что подключаемый конфиг стоит до блока с алиасами. В этом случае срабатывает алиас из главного конфига. Если же блок [includeIf "gitdir:~/"]
поставить после блока алиасов, то отработает подключаемый конфиг. При этом алиасы из главного конфига тоже сохраняются. Это все говорит о том, что работает новая фича очень логично и правильно.
Теперь о том, как это можно использовать в реальной жизни.
Содержимое .gitconfig
(сокращено для удобства):
[user]
name = Maslennikov, Andrey
email = andrew.maslennikov@gmail.com
[alias]
st = status -sb
[includeIf "gitdir:~/work"]
path = ~/.gitconfig-work
[includeIf "gitdir:/"]
path = ~/.gitconfig-machine
Содержимое .gitconfig-work
(подключается только для репозиториев в специальной директории):
[user]
name = Maslennikov, Andrey
email = andrew.maslennikov@<company>.com
Содержимое .gitconfig-machine
(подключается всегда на этой машине):
[http]
proxy = http://user:pass@proxy.at.your.org:port
Что это дает:
work
конфиг работает для рабочих проектов (будьте осторожны с разработкой личных проектов на рабочей машине)machine
конфиг позволяет настроить то, что важно только для этой машины. Это могут быть прокси или настройки инструментов для diff
/merge
операций.Остается только обновить гит на всех машинах и перейти на эту замечательную схему.