multi-git-profiles.md — vim

Несколько Git-профилей на одной машине

Если у тебя рабочий GitLab и личный GitHub (или наоборот), рано или поздно коммиты начнут улетать не с той почтой. Вот как это решить раз и навсегда.


Рабочий GitLab и личный GitHub на одной машине уживаются плохо: рано или поздно коммит в личный проект уезжает с корпоративной почтой, а то и наоборот. Ручные git config --local в каждом репозитории эту проблему не решают - про них просто забывают.

Ниже настройка, после которой Git сам подставляет нужный профиль по адресу репозитория.

1. Отдельные SSH-ключи под каждый аккаунт

Генерируем отдельный ключ под каждый сервис:

ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_github
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_gitlab

Публичные ключи (*.pub) добавляем в настройки соответствующих сервисов.

2. SSH config: свой алиас хоста для каждого профиля

~/.ssh/config - говорим SSH, какой ключ куда:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_github

Host git.company.dev
    HostName git.company.dev
    User git
    IdentityFile ~/.ssh/id_gitlab

Проверяем:

ssh -T [email protected]
ssh -T [email protected]

3. Git config с автопереключением профиля

Главная фишка - includeIf. Git сам подставит нужный профиль в зависимости от remote-URL репозитория. Никаких ручных git config --local.

~/.gitconfig:

[user]
    name = Your Name
    email = [email protected]

[includeIf "hasconfig:remote.*.url:[email protected]:**"]
    path = ~/.gitconfig-github

[includeIf "hasconfig:remote.*.url:[email protected]:**"]
    path = ~/.gitconfig-work

~/.gitconfig-github:

[user]
    email = [email protected]

~/.gitconfig-work:

[user]
    email = [email protected]

Важно: includeIf с hasconfig:remote работает начиная с Git 2.36. Проверь версию: git --version.

4. GPG-подпись коммитов

Если подписываешь коммиты, добавь signingkey в каждый профильный конфиг:

# ~/.gitconfig-github
[user]
    email = [email protected]
    signingkey = ABCD1234

[commit]
    gpgsign = true

5. Скрипт git whoami: под каким профилем я сейчас

Создай ~/.local/bin/git-whoami - быстрая проверка, под каким профилем ты сейчас:

#!/bin/bash
echo "name:  $(git config user.name)"
echo "email: $(git config user.email)"
echo "sign:  $(git config user.signingkey || echo 'не настроен')"
echo "remote: $(git remote get-url origin 2>/dev/null || echo 'нет remote')"
chmod +x ~/.local/bin/git-whoami

Теперь из любого репозитория:

git whoami

Git автоматически найдет git-whoami в PATH и выполнит его как субкоманду.

6. Хук pre-commit как страховка от чужой почты

Защита от коммитов с неправильной почтой. Добавь глобальный хук:

mkdir -p ~/.git-hooks
git config --global core.hooksPath ~/.git-hooks

~/.git-hooks/pre-commit:

#!/bin/bash
EMAIL=$(git config user.email)
REMOTE=$(git remote get-url origin 2>/dev/null)

if [[ "$REMOTE" == *"github.com"* && "$EMAIL" != *"@github-email.com" ]]; then
    echo "⚠ Неправильная почта ($EMAIL) для GitHub-репозитория!"
    echo "  Ожидается: *@github-email.com"
    exit 1
fi

if [[ "$REMOTE" == *"company.dev"* && "$EMAIL" != *"@company.dev" ]]; then
    echo "⚠ Неправильная почта ($EMAIL) для рабочего репозитория!"
    exit 1
fi
chmod +x ~/.git-hooks/pre-commit

Теперь коммит с чужой почтой просто не пройдет.

Права доступа на файлы ключей

Не забудь:

chmod 600 ~/.ssh/id_*
chmod 644 ~/.ssh/config
chmod 644 ~/.ssh/*.pub

Настраивается один раз, дальше Git разруливает профили сам. git whoami для проверки, pre-commit хук как страховка. Если основной терминал у тебя PowerShell, эти команды удобно сразу завернуть в алиасы профиля.