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 config у реальному часі з попередженням у рядку стану
  • Підтримка підмодулів: Автоматичне застосування профілю до 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.kovalenko@techcorp.example.com" -f ~/.ssh/id_ed25519_work

Зареєструйте публічний ключ (файл .pub) кожного SSH-ключа у відповідному обліковому записі 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

Повний приклад з усіма можливостями:

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.kovalenko@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.kovalenko@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 Host (напр.: "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 config
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 Config (завжди): Встановлює git config --local user.name та user.email
  2. SSH-ключ (якщо задано sshKeyPath): Видаляє інші ключі з ssh-agent, додає вибраний
  3. GPG-ключ (якщо задано gpgKeyId): Встановлює git config --local user.signingkey та вмикає підпис
  4. Підмодулі (якщо ввімкнено): Застосовує конфігурацію до всіх підмодулів (за замовчуванням: глибина 1)
  5. Перевірка синхронізації: Перевіряє, чи відповідає застосований профіль фактичному git config

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

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

Коли виконуються перевірки:

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

При виявленні невідповідності:

  • Рядок стану показує іконку ⚠️ з кольором тла попередження
  • Підказка показує таблицю з невідповідними полями (поле, очікуване значення, фактичне значення)
  • Натискання на рядок стану показує варіанти вирішення:
    • Повторно застосувати профіль — Повторне застосування поточного профілю до git config
    • Вибрати інший профіль — Відкрити селектор профілів
    • Ігнорувати — Приховати попередження до наступної перевірки

Вимкнення:

Встановіть 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
~/.ssh/config з IdentityFileОбидва працюють; 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:skovalenko/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.

// Неправильно
"name": "Саша Коваленко (особистий)"

// Правильно
"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