Git ID Switcher
May 8, 2026 · View on GitHub
|
|
Перемикайте кілька Git-профілів одним кліком. Керуйте кількома обліковими записами GitHub, SSH-ключами, GPG-підписами та автоматично застосовуйте профілі до Git-підмодулів.
|
🎯 Чому Git ID Switcher?
Хоча існує багато інструментів для перемикання Git-профілів, Git ID Switcher вирішує складні проблеми, які інші часто ігнорують:
- Проблема підмодулів: При роботі з репозиторіями, що містять підмодулі (теми Hugo, vendor-бібліотеки тощо), зазвичай потрібно вручну виконувати
git config user.nameдля кожного підмодуля. Це розширення елегантно вирішує проблему, рекурсивно застосовуючи профіль до всіх активних підмодулів. - Обробка 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: Налаштуйте розширення
Одразу після встановлення є зразкові профілі. Дотримуйтесь інструкцій нижче, щоб відредагувати їх під себе.
Файли ключів не надсилаються: При налаштуванні шляху до 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") |
name | ✅ | Git user.name — відображається в комітах |
email | ✅ | Git user.email — відображається в комітах |
icon | Емодзі в рядку стану (напр.: "🏠"). Тільки один емодзі | |
service | Назва сервісу (напр.: "GitHub", "GitLab"). Для відображення в UI | |
description | Короткий опис у селекторі та підказці | |
sshKeyPath | Шлях до приватного SSH-ключа (напр.: "~/.ssh/id_ed25519_work") | |
sshHost | Псевдонім SSH Host (напр.: "github-work") | |
gpgKeyId | ID GPG-ключа для підпису комітів |
Обмеження відображення
- Рядок стану: Текст довше ~25 символів скорочується з
... icon: Можна використовувати тільки один емодзі (графемний кластер). Кілька емодзі або довгий текст не дозволяються
Глобальні налаштування
| Налаштування | За замовчуванням | Опис |
|---|---|---|
gitIdSwitcher.identities | Див. зразок | Список налаштувань профілів |
gitIdSwitcher.defaultIdentity | Див. зразок | ID профілю за замовчуванням |
gitIdSwitcher.autoSwitchSshKey | true | Автоматично перемикати SSH-ключ при зміні профілю |
gitIdSwitcher.showNotifications | true | Показувати сповіщення при перемиканні профілю |
gitIdSwitcher.applyToSubmodules | true | Застосовувати профіль до Git-підмодулів |
gitIdSwitcher.submoduleDepth | 1 | Максимальна глибина для вкладених підмодулів (1-5) |
gitIdSwitcher.includeIconInGitConfig | false | Записувати емодзі іконки в Git config user.name |
gitIdSwitcher.syncCheck.enabled | true | Перевіряти, чи відповідає вибраний профіль фактичному git config |
gitIdSwitcher.syncCheck.onFocusReturn | true | Запускати перевірку синхронізації при поверненні фокусу до вікна редактора |
gitIdSwitcher.logging.fileEnabled | false | Зберігати журнал аудиту у файл (перемикання профілів, операції SSH тощо) |
gitIdSwitcher.logging.filePath | "" | Шлях до файлу журналу (напр.: ~/.git-id-switcher/security.log). Порожнє = шлях за замовчуванням |
gitIdSwitcher.logging.maxFileSize | 10485760 | Максимальний розмір файлу до ротації (байти, 1MB-100MB) |
gitIdSwitcher.logging.maxFiles | 5 | Максимальна кількість файлів журналу в ротації (1-20) |
gitIdSwitcher.logging.redactAllSensitive | false | Коли ввімкнено, всі значення маскуються в журналах (режим максимальної конфіденційності) |
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: "Саша Коваленко"
| includeIconInGitConfig | Git config user.name | Підпис коміту |
|---|---|---|
false | Саша Коваленко | Саша Коваленко <email> |
true | 👤 Саша Коваленко | 👤 Саша Коваленко <email> |
Як це працює
Структура рівнів Git config
Git-конфігурація має три рівні, де нижні рівні перезаписуються вищими:
Системний (/etc/gitconfig)
↓ перезаписує
Глобальний (~/.gitconfig)
↓ перезаписує
Локальний (.git/config) ← найвищий пріоритет
Git ID Switcher записує на рівні --local (локальний для репозиторію).
Це означає:
- Зберігає профіль у
.git/configкожного репозиторію - Можна підтримувати різні профілі для різних репозиторіїв
- Глобальні налаштування (
~/.gitconfig) не змінюються
Поведінка при перемиканні профілю
При перемиканні профілю розширення виконує (послідовно):
- Git Config (завжди): Встановлює
git config --local user.nameтаuser.email - SSH-ключ (якщо задано
sshKeyPath): Видаляє інші ключі з ssh-agent, додає вибраний - GPG-ключ (якщо задано
gpgKeyId): Встановлюєgit config --local user.signingkeyта вмикає підпис - Підмодулі (якщо ввімкнено): Застосовує конфігурацію до всіх підмодулів (за замовчуванням: глибина 1)
- Перевірка синхронізації: Перевіряє, чи відповідає застосований профіль фактичному 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 може пробувати ключі в такому порядку:
- Ключі, завантажені в ssh-agent (якими керує Git ID Switcher)
- Ключі, вказані в
~/.ssh/config - Ключі за замовчуванням (
~/.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-ключ не перемикається?
-
Переконайтеся, що
ssh-agentзапущено:eval "$(ssh-agent -s)" -
Перевірте правильність шляху до ключа:
ls -la ~/.ssh/id_ed25519_* -
На 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
Для існуючого репозиторію:
-
Перевірте, що remote URL використовує правильний псевдонім хоста:
git remote -v # Для робочого репозиторію має бути git@github-work:... -
За потреби оновіть:
git remote set-url origin git@github-work:company/repo.git
GPG-підпис не працює?
-
Знайдіть ID вашого GPG-ключа:
gpg --list-secret-keys --keyid-format SHORT -
Перевірте підпис:
echo "test" | gpg --clearsign -
Переконайтеся, що email у профілі збігається з email GPG-ключа
Профіль не визначається?
- Переконайтеся, що ви в Git-репозиторії
- Перевірте
settings.jsonна синтаксичні помилки - Перезавантажте вікно VS Code (
Cmd+Shift+P→ «Перезавантажити вікно»)
Помилка в полі name?
Поле name викликає помилку, якщо містить такі символи:
` $ ( ) { } | & < >
Якщо хочете включити назву сервісу, використовуйте поле service.
// Неправильно
"name": "Саша Коваленко (особистий)"
// Правильно
"name": "Саша Коваленко",
"service": "GitHub"
Нові налаштування не відображаються?
Після оновлення розширення нові налаштування можуть не з'являтися на екрані налаштувань.
Рішення: Повністю перезавантажте комп'ютер.
VS Code та інші редактори кешують схему налаштувань у пам'яті, і вона не завжди оновлюється після «Перезавантаження вікна» або перевстановлення розширення.
Значення за замовчуванням (identities тощо) порожні?
Якщо зразкові налаштування не відображаються навіть при новій установці, причиною може бути Settings Sync.
Якщо раніше ви зберігали порожні налаштування, вони синхронізувалися в хмару і перезаписують значення за замовчуванням при новій установці.
Рішення:
- Знайдіть налаштування на екрані налаштувань
- Натисніть значок шестерні → «Скинути налаштування»
- Синхронізуйте з Settings Sync (старі налаштування видаляться з хмари)
Філософія дизайну
«Хто я?» — єдине питання, на яке відповідає це розширення
Побудовано на Архітектурі Каресансуй: ядро — 100 рядків коду. Тому решту можна витратити на якість (90% покриття тестами, журналювання, таймаути) та навмисні обмеження (без GitHub API, без керування токенами).
Читати повну філософію дизайну
Участь у розробці
Внески вітаються! Див. CONTRIBUTING.md.
Ліцензія
Ліцензія MIT — див. LICENSE.
Подяки
Створено Null;Variant