Несколько 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 хук как страховка.