Удобное разделение нескольких Git-аккаунтов по структуре папок
Как настроить автоматическое переключение профилей Git, рабочей почты и SSH-ключей в зависимости от пути к репозиторию в Linux, macOS и Windows.
Проблема: Коммиты не с того аккаунта
Когда вы одновременно работаете над личными пет-проектами, open-source библиотеками и коммерческими задачами разных заказчиков, важно строго разделять авторские данные коммитов и SSH-ключи. Прописывать git config user.email вручную в каждом новом клоне неудобно и ненадежно — рано или поздно рабочий коммит уйдёт с личной почты.
Лучшее решение — один раз выстроить дерево каталогов и доверить переключение профилей механизму Conditional Includes (includeIf) в Git.
1. Иерархия папок для проектов
Структура, к которой я пришёл, логично группирует все репозитории:
git/
├── personal/ # Персональные проекты и личный GitHub
├── work/ # Рабочие проекты
│ ├── microsoft/ # Проекты компании / клиента A
│ └── google/ # Проекты компании / клиента B
└── other/ # Временные клоны, форки и быстрый аудит кода
Эта структура универсальна и одинаково отлично работает на Ubuntu / Linux, macOS и Windows.
2. Умная настройка через includeIf
Директива includeIf позволяет Git автоматически подгружать дополнительный конфигурационный файл в зависимости от того, в какой папке находится репозиторий.
Шаг 1: Создаем отдельные конфиг-файлы
Создадим настройки для каждого окружения:
~/.gitconfig-personal (Личные проекты):
[user]
name = Sergey Skorokhod
email = sergeyskorokhod2@gmail.com
~/.gitconfig-work-ms (Рабочие проекты Microsoft):
[user]
name = Sergey Skorokhod
email = sergey@microsoft-partner.com
~/.gitconfig-work-google (Рабочие проекты Google):
[user]
name = Sergey Skorokhod
email = sergey@google-contractor.com
Шаг 2: Настраиваем глобальный ~/.gitconfig
В основном файле конфигурации (~/.gitconfig в Linux/macOS или %USERPROFILE%\.gitconfig в Windows) прописываем правила переключения:
# Настройки по умолчанию
[user]
name = Sergey Skorokhod
email = sergeyskorokhod2@gmail.com
[core]
autocrlf = input
editor = code --wait
# Если репозиторий в ~/git/personal/ — применяем личный конфиг
[includeIf "gitdir:~/git/personal/"]
path = ~/.gitconfig-personal
# Если репозиторий в ~/git/work/microsoft/ — применяем рабочий конфиг MS
[includeIf "gitdir:~/git/work/microsoft/"]
path = ~/.gitconfig-work-ms
# Если репозиторий в ~/git/work/google/ — применяем рабочий конфиг Google
[includeIf "gitdir:~/git/work/google/"]
path = ~/.gitconfig-work-google
Совет для Windows: В путях
gitdir:всегда используйте прямые слеши/. Для нечувствительного к регистру сопоставления на дисках NTFS используйте префиксgitdir/i::[includeIf "gitdir/i:C:/Users/sergey/git/work/"] path = C:/Users/sergey/.gitconfig-work
3. Раздельные SSH-ключи (~/.ssh/config)
Если для разных аккаунтов на GitHub/GitLab используются разные приватные ключи, настройте файл ~/.ssh/config:
# Личный аккаунт GitHub
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
# Рабочий аккаунт GitHub
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
При клонировании используйте настроенный алиас:
# Клонирование рабочего проекта
git clone git@github.com-work:company-org/project.git
# Клонирование личного проекта
git clone git@github.com-personal:IllusionOfControl/personal-portfolio.git
4. Проверка активной конфигурации
Чтобы узнать, какой email Git подтянул в текущей директории:
git config user.email
А чтобы увидеть, из какого именно файла загрузилась настройка:
git config --show-origin user.email
Пример вывода:
file:/home/sergey/.gitconfig-work-ms sergey@microsoft-partner.com
Резюме
- Настройка один раз: Иерархия каталогов и правила
includeIfконфигурируются единожды. - Полная автоматизация: Любой новый проект в папке
work/илиpersonal/мгновенно получает правильный email и профиль без ручных манипуляций. - Кроссплатформенность: Работает одинаково надёжно в Linux, macOS и Windows.