Git ID Switcher

May 8, 2026 · View on GitHub

Git ID Switcher Переключайтесь между несколькими Git-профилями одним кликом. Управляйте несколькими аккаунтами GitHub, SSH-ключами и GPG-подписью, а также автоматически применяйте профиль к Git-подмодулям.

Open VSX Registry License: MIT OpenSSF Scorecard OpenSSF Best Practices SLSA 3 Sigstore SBOM Security CI Platform codecov Quality Gate Status Snyk monitored Gitleaks Harden-Runner Karesansui Architecture
26 Languages 🇺🇸 🇯🇵 🇨🇳 🇹🇼 🇰🇷 🇩🇪 🇫🇷 🇪🇸 🇧🇷 🇮🇹 🇷🇺 🇵🇱 🇹🇷 🇨🇿 🇭🇺 🇧🇬 🇺🇦 🌍 🌺 🐻 🐉 🖖 🐱 🏴‍☠️ 🎭

Демо

🎯 Почему Git ID Switcher?

Хотя существует много инструментов для переключения Git-профилей, Git ID Switcher решает сложные проблемы, которые другие часто упускают:

  1. Проблема подмодулей: При работе с репозиториями, содержащими подмодули (темы Hugo, vendor-библиотеки и т.д.), обычно приходится вручную настраивать git config user.name для каждого подмодуля. Это расширение элегантно решает проблему, рекурсивно применяя ваш профиль ко всем активным подмодулям.
  2. Обработка SSH и GPG: Расширение не просто меняет ваше имя — оно также переключает SSH-ключи в ssh-agent и настраивает GPG-подпись, чтобы вы никогда не сделали коммит с неправильной подписью.

Возможности

  • UI для управления профилями: Добавляйте, редактируйте, удаляйте и сортируйте профили без редактирования settings.json
  • Переключение профиля одним кликом: Мгновенная смена Git user.name и user.email
  • Интеграция в статусную строку: Всегда видите текущий профиль
  • Проверка синхронизации: Обнаружение расхождений между профилем и конфигурацией git в реальном времени с предупреждением в статусной строке
  • Поддержка подмодулей: Автоматическое применение профиля к Git-подмодулям
  • Управление SSH-ключами: Автоматическое переключение SSH-ключей в ssh-agent
  • Поддержка GPG-подписи: Настройка GPG-ключа для подписи коммитов (опционально)
  • Подробные подсказки: Полная информация с описанием и SSH-хостом
  • Кроссплатформенность: Работает на macOS, Linux и Windows
  • Многоязычность: Поддержка 17 языков

🌏 О многоязычной поддержке

Я ценю существование меньшинств. Я не хочу отбрасывать их только потому, что их мало. Даже если переводы не идеальны, я надеюсь, что вы почувствуете наше намерение понять и уважать языки меньшинств.

Это расширение поддерживает все 17 языков, которые поддерживает VS Code. Кроме того, для документации README мы пробуем переводить на языки меньшинств и даже шуточные языки.

Это не просто «глобальная поддержка» — это «уважение к языковому разнообразию». И я буду рад, если это станет инфраструктурой, где коммиты, делающие мир лучше, приходят от разработчиков со всего мира, преодолевая языковые барьеры.


Быстрый старт

Типичная настройка для управления личным аккаунтом и рабочим аккаунтом (Enterprise Managed User).

Шаг 1: Подготовка SSH-ключей

Сначала создайте SSH-ключи для каждого аккаунта (пропустите, если уже есть):

# Личный
ssh-keygen -t ed25519 -C "sasha@personal.example.com" -f ~/.ssh/id_ed25519_personal

# Рабочий
ssh-keygen -t ed25519 -C "sasha.petrov@techcorp.example.com" -f ~/.ssh/id_ed25519_work

Зарегистрируйте публичный ключ (файл .pub) каждого ключа в соответствующем аккаунте GitHub.

Примечание: На GitHub регистрируется id_ed25519_personal.pub (публичный ключ). id_ed25519_personal (без расширения) — это приватный ключ. Никогда не делитесь им и не загружайте его никуда.

Шаг 2: Настройка SSH config

Отредактируйте ~/.ssh/config:

# Личный аккаунт GitHub (по умолчанию)
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes

# Рабочий аккаунт GitHub
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

Шаг 3: Настройка расширения

Сразу после установки доступны примеры профилей. Следуйте этому руководству, чтобы отредактировать их под себя.

Начальная настройка (13 шагов): открытие управления профилями из статусной строки, редактирование и создание

Файлы ключей не отправляются: При настройке пути SSH-ключа сохраняется только путь (расположение) к файлу ключа. Содержимое файла ключа никогда не загружается и не отправляется куда-либо.

При использовании GPG-подписи: Вы также можете настроить gpgKeyId на экране редактирования профиля. Как узнать ID GPG-ключа — см. раздел «Устранение неполадок».

Совет: Вы также можете настроить напрямую в settings.json. Откройте настройки расширения (Cmd+, / Ctrl+,) → найдите «Git ID Switcher» → нажмите «Редактировать в settings.json». Примеры JSON-формата см. в разделе «Полный пример: 5 аккаунтов с SSH + GPG».


Полный пример: 5 аккаунтов с SSH + GPG

Полный пример, объединяющий всё:

Конфигурация SSH (~/.ssh/config)

# Личный аккаунт (по умолчанию)
Host github-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes

# Рабочий аккаунт (Enterprise Managed User от компании)
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

# Клиент A – контрактная работа (Bitbucket)
Host bitbucket-clienta
    HostName bitbucket.org
    User git
    IdentityFile ~/.ssh/id_ed25519_clienta
    IdentitiesOnly yes

# Клиент B – проект на площадке (Bitbucket)
Host bitbucket-clientb
    HostName bitbucket.org
    User git
    IdentityFile ~/.ssh/id_ed25519_clientb
    IdentitiesOnly yes

# OSS-вклад (GitLab)
Host gitlab-oss
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_ed25519_oss
    IdentitiesOnly yes

Настройки расширения

{
  "gitIdSwitcher.identities": [
    {
      "id": "personal",
      "name": "Саша Петров",
      "email": "sasha@personal.example.com",
      "service": "GitHub",
      "icon": "🏠",
      "description": "Личные проекты",
      "sshKeyPath": "~/.ssh/id_ed25519_personal",
      "sshHost": "github-personal",
      "gpgKeyId": "ABCD1234EF567890"
    },
    {
      "id": "work-main",
      "name": "Саша Петров",
      "email": "sasha.petrov@techcorp.example.com",
      "service": "GitHub Работа",
      "icon": "💼",
      "description": "TechCorp основная работа",
      "sshKeyPath": "~/.ssh/id_ed25519_work",
      "sshHost": "github-work",
      "gpgKeyId": "9876543210FEDCBA"
    },
    {
      "id": "client-a",
      "name": "Саша Петров",
      "email": "sasha@clienta.example.com",
      "service": "Bitbucket",
      "icon": "🏢",
      "description": "ClientA контракт",
      "sshKeyPath": "~/.ssh/id_ed25519_clienta",
      "sshHost": "bitbucket-clienta"
    },
    {
      "id": "client-b",
      "name": "С.Петров",
      "email": "s.petrov@clientb.example.com",
      "service": "Bitbucket",
      "icon": "🏭",
      "description": "ClientB на месте",
      "sshKeyPath": "~/.ssh/id_ed25519_clientb",
      "sshHost": "bitbucket-clientb"
    },
    {
      "id": "oss",
      "name": "sasha-dev",
      "email": "sasha.dev@example.com",
      "service": "GitLab",
      "icon": "🌟",
      "description": "Вклад в OSS",
      "sshKeyPath": "~/.ssh/id_ed25519_oss",
      "sshHost": "gitlab-oss"
    }
  ],
  "gitIdSwitcher.defaultIdentity": "personal",
  "gitIdSwitcher.autoSwitchSshKey": true,
  "gitIdSwitcher.applyToSubmodules": true
}

Примечание: 4-й профиль (client-b) использует сокращённое имя, а 5-й (oss) — ник разработчика. Для каждого профиля можно задать разное отображаемое имя, даже для одного человека.


Управление профилями

Нажмите на статусную строку → «Управление профилями» внизу списка, чтобы открыть экран управления. Добавление, редактирование, удаление и сортировка профилей выполняются прямо через UI.

Управление профилями: удаление и сортировка

Вы также можете удалить профиль через палитру команд: Git ID Switcher: Delete Identity.


Команды

КомандаОписание
Git ID Switcher: Select IdentityОткрыть выбор профиля
Git ID Switcher: Delete IdentityУдалить профиль
Git ID Switcher: Show Current IdentityПоказать информацию о текущем профиле
Git ID Switcher: Show DocumentationПоказать документацию

Справочник по настройкам

Свойства профиля

СвойствоОбязательноОписание
idУникальный идентификатор (напр.: "personal", "work")
nameGit user.name — отображается в коммитах
emailGit user.email — отображается в коммитах
iconЭмодзи в статусной строке (напр.: "🏠"). Только один эмодзи
serviceНазвание сервиса (напр.: "GitHub", "GitLab"). Используется в UI
descriptionКраткое описание в селекторе и подсказке
sshKeyPathПуть к приватному SSH-ключу (напр.: "~/.ssh/id_ed25519_work")
sshHostАлиас хоста в SSH config (напр.: "github-work")
gpgKeyIdID GPG-ключа для подписи коммитов

Ограничения отображения

  • Статусная строка: Текст длиннее ~25 символов обрезается с ...
  • icon: Разрешён только один эмодзи (кластер графем). Несколько эмодзи или длинные строки не поддерживаются

Глобальные настройки

НастройкаПо умолчаниюОписание
gitIdSwitcher.identitiesСм. примерыСписок конфигураций профилей
gitIdSwitcher.defaultIdentityСм. примерыID профиля по умолчанию
gitIdSwitcher.autoSwitchSshKeytrueАвтоматически переключать SSH-ключ при смене профиля
gitIdSwitcher.showNotificationstrueПоказывать уведомление при переключении профиля
gitIdSwitcher.applyToSubmodulestrueПрименять профиль к Git-подмодулям
gitIdSwitcher.submoduleDepth1Максимальная глубина для вложенных подмодулей (1-5)
gitIdSwitcher.includeIconInGitConfigfalseВключать эмодзи в Git config user.name
gitIdSwitcher.syncCheck.enabledtrueПроверять, совпадает ли выбранный профиль с текущей конфигурацией git
gitIdSwitcher.syncCheck.onFocusReturntrueЗапускать проверку синхронизации при возврате фокуса в окно редактора
gitIdSwitcher.logging.fileEnabledfalseСохранять журнал аудита в файл (переключения профилей, операции SSH и т.д.)
gitIdSwitcher.logging.filePath""Путь к файлу журнала (напр.: ~/.git-id-switcher/security.log). Пустая строка — путь по умолчанию
gitIdSwitcher.logging.maxFileSize10485760Максимальный размер файла до ротации (байты, 1MB-100MB)
gitIdSwitcher.logging.maxFiles5Максимальное количество файлов ротации (1-20)
gitIdSwitcher.logging.redactAllSensitivefalseПри включении все значения маскируются в журналах (режим максимальной конфиденциальности)
gitIdSwitcher.logging.level"INFO"Уровень детализации журнала (DEBUG, INFO, WARN, ERROR, SECURITY). Записывается выбранный уровень и выше
gitIdSwitcher.commandTimeouts{}Пользовательские таймауты для команд (мс, 1сек-5мин). Напр.: {"git": 15000, "ssh-add": 10000}

О настройке includeIconInGitConfig

Управляет поведением при установленном поле icon:

ЗначениеПоведение
false (по умолчанию)icon отображается только в UI редактора. В Git config записывается только name
trueВ Git config записывается icon + name. Эмодзи остаётся в истории коммитов

Пример: icon: "👤", name: "Саша Петров"

includeIconInGitConfigGit config user.nameПодпись коммита
falseСаша ПетровСаша Петров <email>
true👤 Саша Петров👤 Саша Петров <email>

Как это работает

Структура уровней Git config

Конфигурация Git имеет три уровня, где нижние уровни переопределяют верхние:

Системный (/etc/gitconfig)
    ↓ переопределяет
Глобальный (~/.gitconfig)
    ↓ переопределяет
Локальный (.git/config)  ← высший приоритет

Git ID Switcher записывает в --local (локально для репозитория).

Это означает:

  • Профиль сохраняется в .git/config каждого репозитория
  • Можно поддерживать разные профили для разных репозиториев
  • Глобальные настройки (~/.gitconfig) не изменяются

При переключении профиля

При переключении профиля расширение выполняет (по порядку):

  1. Git-конфигурация (всегда): Устанавливает git config --local user.name и user.email
  2. SSH-ключ (если задан sshKeyPath): Удаляет другие ключи из ssh-agent, добавляет выбранный
  3. GPG-ключ (если задан gpgKeyId): Устанавливает git config --local user.signingkey и включает подпись
  4. Подмодули (если включено): Применяет конфигурацию ко всем подмодулям (по умолчанию: глубина 1)
  5. Проверка синхронизации: Проверяет, что применённый профиль совпадает с текущей конфигурацией git

Проверка синхронизации

Сравнивает выбранный профиль с фактическими значениями git config --local (user.name, user.email, user.signingkey) и показывает предупреждение в статусной строке при обнаружении расхождения.

Когда выполняются проверки:

  • Сразу после применения профиля
  • При смене папки рабочей области
  • При изменении конфигурации
  • При возврате фокуса в окно редактора (с debounce 500 мс)

При обнаружении расхождения:

  • В статусной строке отображается значок ⚠️ с предупреждающим фоном
  • Подсказка показывает таблицу с расхождениями (поле, ожидаемое значение, фактическое значение)
  • При нажатии на статусную строку предлагаются варианты решения:
    • Повторно применить профиль — Повторно применить текущий профиль к конфигурации git
    • Выбрать другой профиль — Открыть выбор профиля
    • Отклонить — Скрыть предупреждение до следующей проверки

Для отключения:

Установите gitIdSwitcher.syncCheck.enabled в false, чтобы отключить все проверки синхронизации. Чтобы отключить только проверку при возврате фокуса, установите gitIdSwitcher.syncCheck.onFocusReturn в false.

Как работает распространение на подмодули

Локальные настройки применяются к каждому репозиторию отдельно, поэтому они не применяются автоматически к подмодулям. Поэтому это расширение предоставляет функцию распространения на подмодули (подробности см. в разделе «Продвинутое: Поддержка подмодулей»).

Детали управления SSH-ключами

Git ID Switcher управляет SSH-ключами через ssh-agent:

ОперацияВыполняемая команда
Добавить ключssh-add <keyPath>
Удалить ключssh-add -d <keyPath>
Список ключейssh-add -l

Важно: Это расширение не изменяет ~/.ssh/config. Настройку SSH config нужно выполнить вручную (см. Шаг 2 в «Быстром старте»).

Взаимодействие с существующей SSH-конфигурацией

Если у вас уже есть SSH-настройки, Git ID Switcher работает следующим образом:

Ваша настройкаПоведение Git ID Switcher
IdentityFile указан в ~/.ssh/configОба работают; IdentitiesOnly yes предотвращает конфликты
Установлена переменная GIT_SSH_COMMANDИспользуется ваша SSH-команда; ssh-agent продолжает работать
Установлен git config core.sshCommandТо же, что выше
SSH-переменные через direnvСовместимы; ssh-agent работает независимо

Рекомендация: Всегда устанавливайте IdentitiesOnly yes в SSH config. Это предотвращает попытки SSH использовать несколько ключей.

Почему IdentitiesOnly yes?

Без этой настройки SSH может пробовать ключи в следующем порядке:

  1. Ключи, загруженные в ssh-agent (управляются Git ID Switcher)
  2. Ключи, указанные в ~/.ssh/config
  3. Ключи по умолчанию (~/.ssh/id_rsa, ~/.ssh/id_ed25519 и т.д.)

Это может привести к ошибкам аутентификации или использованию неправильного ключа.

При установке IdentitiesOnly yes SSH использует только указанный ключ. Это гарантирует использование ключа, настроенного в Git ID Switcher.

# Рекомендуемая настройка
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes  # ← эта строка важна

С этой настройкой при подключении к хосту github-work используется только ~/.ssh/id_ed25519_work, другие ключи не пробуются.


Продвинутое: Поддержка подмодулей

Для сложных репозиториев с Git-подмодулями управление профилями часто вызывает проблемы. При коммите в подмодуле Git использует локальную конфигурацию этого подмодуля, которая может использовать глобальную конфигурацию (неправильный email!), если не настроена явно.

Git ID Switcher автоматически обнаруживает подмодули и применяет к ним выбранный профиль.

{
  "gitIdSwitcher.applyToSubmodules": true,
  "gitIdSwitcher.submoduleDepth": 1
}
  • applyToSubmodules: Включить/отключить эту функцию
  • submoduleDepth: Насколько глубоко применять?
    • 1: Только прямые подмодули (самый частый случай)
    • 2+: Вложенные подмодули (подмодули внутри подмодулей)

Это гарантирует, что ваш профиль всегда правильный, независимо от того, делаете ли вы коммит в основном репозитории или в vendor-библиотеке.


Устранение неполадок

SSH-ключ не переключается?

  1. Убедитесь, что ssh-agent запущен:

    eval "$(ssh-agent -s)"
    
  2. Проверьте правильность пути к ключу:

    ls -la ~/.ssh/id_ed25519_*
    
  3. На macOS добавьте в Keychain один раз:

    ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
    

Неправильный профиль при push?

При новом клонировании:

При клонировании рабочего репозитория используйте алиас хоста, настроенный в SSH config:

# Рабочий (используем алиас github-work)
git clone git@github-work:company/repo.git

# Личный (используем github.com по умолчанию)
git clone git@github.com:yourname/repo.git

Для существующего репозитория:

  1. Проверьте, что remote URL использует правильный алиас хоста:

    git remote -v
    # Для рабочего репозитория должно быть git@github-work:...
    
  2. Обновите при необходимости:

    git remote set-url origin git@github-work:company/repo.git
    

GPG-подпись не работает?

  1. Найдите ID вашего GPG-ключа:

    gpg --list-secret-keys --keyid-format SHORT
    
  2. Протестируйте подпись:

    echo "test" | gpg --clearsign
    
  3. Убедитесь, что email профиля совпадает с email GPG-ключа

Профиль не определяется?

  • Убедитесь, что находитесь в Git-репозитории
  • Проверьте settings.json на синтаксические ошибки
  • Перезагрузите окно VS Code (Cmd+Shift+P → «Перезагрузить окно»)

Ошибка в поле name?

Следующие символы в поле name вызывают ошибку:

` $ ( ) { } | & < >

Если хотите добавить информацию о сервисе, используйте поле service.

// NG
"name": "Саша Петров (Личный)"

// OK
"name": "Саша Петров",
"service": "GitHub"

Новые настройки не отображаются?

После обновления расширения новые настройки могут не отображаться в интерфейсе.

Решение: Полностью перезагрузите компьютер.

Редакторы на базе VS Code кэшируют схему настроек в памяти, и «Перезагрузить окно» или переустановка расширения может быть недостаточно.

Значения по умолчанию (identities и т.д.) пустые?

Если примеры не появляются даже после новой установки, причиной может быть Settings Sync.

Если вы ранее сохранили пустые настройки, они могли синхронизироваться в облако и перезаписать значения по умолчанию при новых установках.

Решение:

  1. Найдите настройку в интерфейсе настроек
  2. Нажмите на шестерёнку → «Сбросить настройку»
  3. Синхронизируйте с Settings Sync (старые настройки удалятся из облака)

Философия дизайна

«Кто я» — единственный вопрос, на который отвечает это расширение

Построено на Архитектуре Карэсансуй: ядро в 100 строк. Именно поэтому остальное можно посвятить качеству (90% покрытие тестами, логирование, таймауты) и намеренным ограничениям (без GitHub API, без управления токенами).

Karesansui Architecture

Читать полную философию дизайна


Участие в разработке

Вклад приветствуется! См. CONTRIBUTING.md.

Лицензия

MIT — см. LICENSE.

Благодарности

Создано Null;Variant