Git config с разделением по проектам

Возникла потребность настраивать по-разному конфиги гита для разных проектов (email контактный поменять, хотя бы, или хук на прогон тестов повесить).

Ну и понятно, что как-то эти конфиги подкладывать туда-сюда – не слишком увлекательно. К счастью, в свежих версиях гита – есть инклюды. В том числе – по условию – includeIf. Вот ими и стоит воспользоваться.

Основной конфиг git

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

Примерно вот так у меня это выглядит, по условию включается конфиг из файла gitconfig-project-1:

[user] name = Dmitry email = dimio@dimio.org [includeIf "gitdir:~/project-1/repos/"] path = ~/.config/git/gitconfig-project-1

Важный момент – директорию после gitdir: нужно указывать без отделения пробелом.

Вложенный конфиг git

А вот так – выглядит сам файл ~/.config/git/gitconfig-project-1

[user] email = dmitry@dimio.org [core] hooksPath = ~/.config/git/hooks/ autocrlf = input sshCommand = "ssh -F ${HOME}/.ssh/config-project-1"

Тут уже как раз и переопределены email, хуки (для этого проекта активирован автопрогон тестов в pre-push хуке) и конфиг ssh (там специфические настройки для доступа к репозиторию по ключу).

Разделение credentials

Раз уж зашла речь о разделении конфигов и о доступе – можно сразу настройки доступа по http(s) разбить немного.

Включаются они так: git config --global credential.helper store. И после этого лежат в ~/.git-credentials в открытом виде!

Разделить их для разных репозиториев внутри одного хоста – можно так (на примере github): git config --global credential.github.com.useHttpPath true

И тогда в .git-credentials будут отдельные записи лежать:

https://<USERNAME>:<PASSWORD>@github.com/path/to/repo1.git https://<USERNAME>:<PASSWORD>@github.com/path/to/repo2.git

Но, безусловно, удобней (да и безопасней, пожалуй) – пользоваться доступом с ssh ключами.

Начать дискуссию