Несколько 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, эти команды удобно сразу завернуть в алиасы профиля.