amaslenn.github.com

View My GitHub Profile

Conditional include in git config

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

Что это дает:

Остается только обновить гит на всех машинах и перейти на эту замечательную схему.