Перейти к основному содержимому

Множественные сервисы Git на одном компьютере

Разработчику Архитектору Инженеру

На одном ноутбуке часто живут сразу GitHub (open source), GitVerse или SourceCraft (рабочие репозитории) и корпоративный GitLab. Конфликта между "системами Git" нет — конфликт бывает только в учётных данных: какой SSH-ключ или PAT подставить при git push. Ниже — ключи, ~/.ssh/config, несколько remote и зеркалирование; основы авторизации — Безопасность кода, PAT и SSH — там же.


Множественные сервисы Git на одном компьютере

Одна машина может работать с множеством систем контроля версий одновременно. Конфликт возникает только при неправильной настройке параметров аутентификации и конфигурации удалённых хранилищ.

Использование нескольких платформ позволяет поддерживать разделение между рабочими проектами и личными экспериментами. Компании могут использовать внутреннюю инфраструктуру, а частные лица сохраняют проекты на публичных сервисах.

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

ПреимуществоОписание
Разделение проектовРабочие задачи и личные исследования не смешиваются
Тестирование мигацииПроверка новой платформы без удаления старых данных
Бэкап данныхНаличие копий кода на разных географических серверах
ДоступностьРезервный канал связи при блокировке одного сервиса

Архитектура настройки ключей

SSH ключ — это пара криптографических файлов для подтверждения личности пользователя при подключении к серверу. Каждый сервис использует свою пару ключей при необходимости полного разделения доступа.

Генерация ключей (ssh-keygen, отдельный файл на сервис):

# Генерация ключа для GitHub
ssh-keygen -t ed25519 -C "user@github.com" -f ~/.ssh/id_ed25519_github

# Генерация ключа для GitVerse
ssh-keygen -t ed25519 -C "user@gitverse.ru" -f ~/.ssh/id_ed25519_gitverse

Файлы размещаются в директории .ssh домашней папки пользователя. Имя файла определяет назначение ключа при подключении.

Проверка готовности ключей происходит через демонстрацию подключения к обоим серверам.

# Проверка ключа GitHub
ssh -T git@github.com

# Проверка ключа GitVerse
ssh -T git@gitverse.ru

Успешное соединение выводит имя пользователя сервиса. Неудачное соединение указывает на отсутствие правильного ключа или ошибки конфигурации.


Конфигурация клиента SSH

SSH конфиг хранит правила выбора ключа для каждого хостового адреса. Файл находится по пути .ssh/config внутри домашней директории.

Настройка включает определение имени хоста, типа аутентификации и соответствующего файла ключа.

# Настройки для GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes

# Настройки для GitVerse
Host gitverse.ru
HostName gitverse.ru
User git
IdentityFile ~/.ssh/id_ed25519_gitverse
IdentitiesOnly yes

Параметр IdentitiesOnly yes принуждает SSH использовать только указанный файл и игнорировать другие ключи из списка. Это предотвращает случайное подключение не к тем серверам.

Перезагрузка агента SSH активизирует изменения. Команда выполняет удаление всех текущих ключей из памяти и загрузку новых правил.

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_ed25519_github
ssh-add ~/.ssh/id_ed25519_gitverse

Управление удалёнными ссылками

Удалённый источник — это адрес сервера, куда отправляются локальные коммиты. Каждая команда работает с одной конкретной системой при настройке ссылки.

Добавление удалённого источника (git remote add); имя ссылки используется в git push и git pull:

# Добавление основного источника для рабочей задачи
git remote add gitverse https://gitverse.ru/user/repo.git

# Добавление резервного источника для публичного проекта
git remote add github https://github.com/user/repo.git

Список всех источников отображается через опцию -v. Вариант показывает полное URL и краткое название каждой ссылки.

git remote -v

# Вывод —
# gitverse https://gitverse.ru/user/project.git (fetch)
# gitverse https://gitverse.ru/user/project.git (push)
# github https://github.com/user/project.git (fetch)
# github https://github.com/user/project.git (push)

Переключение между источниками происходит вручную перед каждым пушем или фейлом.

# Отправка изменений на GitVerse
git push gitverse main

# Отправка изменений на GitHub
git push github main

Локальный репозиторий содержит историю независимо от выбранного удалённого источника. Команды работают с идентичными объектами.


Переменные окружения системы

Переменные окружения хранят настройки для автоматического выбора ключа при выполнении операций. Их можно задать глобально или локально в зависимости от потребностей проекта.

Глобальная настройка применяется ко всем репозиториям пользователя. Локальная настройка действует только в пределах конкретной директории.

# Глобальная переменная для SSH ключа по умолчанию
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519_github"

# Локальная переменная для конкретного проекта
git config --local core.sshCommand "ssh -i ~/.ssh/id_ed25519_gitverse"

Использование переменных снижает вероятность человеческой ошибки при выборе неправильного ключа. Система автоматически применяет нужные параметры во время выполнения задач.

Открытие терминала после установки переменных делает их доступными для всех процессов внутри этого сеанса. Новые окна не наследуют значения без повторной настройки.


Миграция репозиториев между платформами

Миграция означает перенос всей истории коммитов из одного сервиса в другой без потери метаданных. Процесс сохраняет авторов, даты и сообщения всех ревизий.

Подготовка включает клонирование существующего репозитория с полным флагом.

git clone --mirror https://github.com/user/existing-repo.git
cd existing-repo.git
git remote set-url origin https://gitverse.ru/user/new-repo.git
git push --force

Флаг --mirror копирует полную структуру включая ветки и теги. Операция занимает больше времени при большом количестве объектов в истории.

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


Автоматизация выбора цели

Автоматизация исключает необходимость ручного ввода команды при каждом обновлении кода. Правила определяют приоритет целей в зависимости от ветки или автора коммита.

Шаблоны скриптов анализируют текущее состояние репозитория и выбирают правильную ссылку. Сценарии используют переменные окружения для динамической настройки.

#!/bin/bash

# Определяем целевой хост
TARGET_HOST="github.com"
if grep -q "work-project" .git/config; then
TARGET_HOST="gitverse.ru"
fi

# Выполняем пуш к выбранному хосту
git push origin main
echo "Push завершён на $TARGET_HOST"

Скрипты размещают в директории .git/hooks/ для автоматического вызова перед отправкой. Поддерживается несколько типов триггеров перед коммитом и перед пушем.

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


HTTPS и несколько аккаунтов

Если используете HTTPS вместо SSH, Git Credential Manager хранит токены отдельно по URL. Для двух аккаунтов на одном хосте (редко, но бывает с enterprise) удобнее SSH с разными ключами или явный PAT в URL только в учебных примерах (в проде — credential helper).

# Клон по HTTPS — логин + PAT (не пароль от сайта)
git clone https://github.com/username/repo.git

# Разные remotes — разные credential при первом push (GCM запомнит)
git remote add github https://github.com/user/repo.git
git remote add gitverse https://gitverse.ru/user/repo.git

Получение PAT на GitHub — Settings → Developer settings → Personal access tokens (подробнее в 1). Не коммитьте токены в репозиторий — Методы защиты пользовательских и корпоративных данных.

СпособПлюсМинус
SSH + ~/.ssh/configПрозрачно для нескольких хостовНужна настройка ключей
HTTPS + GCMРаботает за корпоративным proxyПутаница при смене аккаунта
insteadOf в configПодмена URL для форковТолько для опытных

Пример insteadOf для корпоративного зеркала:

git config --global url."git@github.com-work:".insteadOf "https://github.com/"

Диагностика проблем

СимптомПричинаРешение
Permission denied (publickey)Неверный ключ для хостаssh -T git@github.com, проверить ~/.ssh/config
Push уходит "не туда"Default remote или credential другого аккаунтаgit remote -v, git config --local --list
fatal: refusing to merge unrelated historiesРазные корни репоОсознанно --allow-unrelated-histories или новый clone
Два аккаунта на HTTPS путаютсяGCM кэшWindows Credential Manager → удалить старый github.com
После миграции нет веток на новом хостеPush без --mirror / без всех refsgit push --mirror из bare clone (Gitverse - отечественная альтернатива Git)

Проверка "какой ключ пошёл на сервер":

ssh -vT git@github.com 2>&1 | findstr "Offering"

На Linux/macOS: ssh -vT git@github.com 2>&1 | grep Offering.