multi-git-profiles.md — vim

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

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


1. SSH-ключи

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

ssh-keygen -t ed25519 -C "you@github.com" -f ~/.ssh/id_github
ssh-keygen -t ed25519 -C "you@company.dev" -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 git@github.com
ssh -T git@git.company.dev

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

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

~/.gitconfig:

[user]
    name = Your Name
    email = default@mail.com

[includeIf "hasconfig:remote.*.url:git@github.com:**"]
    path = ~/.gitconfig-github

[includeIf "hasconfig:remote.*.url:git@git.company.dev:**"]
    path = ~/.gitconfig-work

~/.gitconfig-github:

[user]
    email = you@github.com

~/.gitconfig-work:

[user]
    email = you@company.dev

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

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

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

# ~/.gitconfig-github
[user]
    email = you@github.com
    signingkey = ABCD1234

[commit]
    gpgsign = true

5. Автоматизация: скрипт проверки

Создай ~/.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 хук как страховка.