Удалённые репозитории Git: SSH, push и bare-репозитории
Удалённые репозитории в Git: SSH, git push и bare-репозитории #
Статья обновлена: март 2026
К этому моменту ты умеешь работать с Git локально: создавать коммиты, смотреть историю, управлять ветками. Но Git по-настоящему раскрывается в командной работе — а для этого нужен удалённый репозиторий. В этой статье разберём как устроены удалённые репозитории, какие протоколы использует Git, как создать SSH-ключ и что такое bare-репозиторий.
Что такое удалённый репозиторий #
Удалённый репозиторий — это копия твоего проекта, хранящаяся на сервере. Обычно это GitHub, GitLab или собственный сервер команды. Главная задача удалённого репозитория: быть общей точкой синхронизации для всех участников проекта.
Git локальный (на твоём компьютере) и Git удалённый (на сервере) — это два независимых репозитория. Ты работаешь локально, а когда готов поделиться изменениями — отправляешь их на сервер командой git push. Коллеги забирают твои изменения командой git pull.
# Посмотреть все настроенные удалённые репозитории
git remote -v
# Добавить удалённый репозиторий с именем origin
git remote add origin [email protected]:username/project.git
# Отправить ветку main на origin
git push origin main
# Получить изменения из origin
git pull origin main
Подробнее об origin и работе с удалёнными репозиториями читай в статье Что такое origin в Git.
Протоколы Git #
Git поддерживает несколько протоколов для передачи данных между локальным и удалённым репозиторием. Выбор протокола влияет на безопасность, удобство и скорость.
Локальный протокол #
Самый простой вариант — удалённый репозиторий находится в другой директории на том же компьютере или в сетевой папке (NFS). Используется редко, в основном для тестирования или внутренних инструментов CI.
# Клонировать из локальной папки
git clone /opt/git/project.git
# Клонировать явно по протоколу file://
git clone file:///opt/git/project.git
# Добавить локальный репозиторий как удалённый
git remote add local_proj /opt/git/project.git
Плюсы: простота, никаких настроек. Минусы: только для локальной сети, нет шифрования, неудобно при удалённой работе.
Протокол SSH #
Самый распространённый для командной работы. SSH доступен на любом Linux/macOS сервере, обеспечивает шифрование и поддерживает как чтение, так и запись.
# Клонировать по SSH (два эквивалентных способа)
git clone ssh://user@server/opt/git/project.git
git clone user@server:opt/git/project.git
# Короткая запись в scp-стиле (самая популярная)
git clone [email protected]:username/project.git
Плюсы: безопасность, шифрование, аутентификация по ключу (без ввода пароля). Минусы: нельзя дать анонимный доступ на чтение — нужен аккаунт на сервере.
Протокол HTTPS #
Работает через стандартный HTTP/HTTPS. Удобен для публичных репозиториев и там, где SSH заблокирован корпоративным файрволом.
# Клонировать по HTTPS
git clone https://github.com/username/project.git
Плюсы: работает везде где есть интернет, легко настроить, поддерживает анонимный доступ на чтение. Минусы: требует ввода токена при каждом push (если не настроен credential manager).
Протокол Git #
Специальный демон Git (порт 9418) без аутентификации. Самый быстрый протокол, но без возможности записи и без контроля доступа. Используется для крупных публичных проектов с высокой нагрузкой на чтение.
git clone git://github.com/user/project.git
Плюсы: максимальная скорость. Минусы: нет аутентификации, сложно настроить, порт 9418 часто заблокирован.
Bare-репозиторий: что это и зачем нужен #
Обычный репозиторий содержит рабочую директорию (файлы проекта) и папку .git (историю Git). Bare-репозиторий — только историю, без рабочей директории. Именно такой репозиторий используется как центральное хранилище на сервере.
Почему на сервере нужен bare-репозиторий? В обычный репозиторий нельзя выполнить git push если там есть рабочая директория — Git запретит, чтобы не перезатереть текущее состояние файлов. Bare-репозиторий лишён этого ограничения: он создан только для приёма и хранения изменений.
# Создать bare-репозиторий на сервере
git init --bare project.git
# Или клонировать существующий репозиторий как bare
git clone --bare /path/to/project project.git
# По соглашению bare-репозитории называют с суффиксом .git
Подробнее о команде git init --bare читай в статье git init: как создать новый репозиторий.
Настройка собственного Git-сервера #
Если нужен самостоятельный сервер без GitHub/GitLab — вот минимальная инструкция.
Шаг 1: создать bare-репозиторий на сервере:
# На сервере
ssh [email protected]
mkdir -p /opt/git
cd /opt/git
git init --bare project.git
Шаг 2: разработчики клонируют репозиторий:
# На компьютере разработчика
git clone [email protected]:/opt/git/project.git
cd project
Шаг 3: первый push:
# Создать несколько коммитов
echo "# Project" > README.md
git add README.md
git commit -m "Initial commit"
# Отправить на сервер
git push origin main
Шаг 4: дать команде право на запись:
# На сервере: добавить пользователей в группу
# или использовать общего пользователя 'git' с authorized_keys
ssh [email protected]
cd /opt/git/project.git
git init --bare --shared
# --shared автоматически настраивает права для группы
Создание SSH-ключа #
SSH-аутентификация по ключу позволяет подключаться к серверу без ввода пароля при каждом git push. Вот как это настроить:
Шаг 1: проверить есть ли уже ключ:
ls ~/.ssh
# Ищи файлы id_ed25519 / id_ed25519.pub или id_rsa / id_rsa.pub
# Файл .pub — публичный ключ, второй — приватный
Шаг 2: сгенерировать новый ключ (если нет):
# Современный стандарт — ed25519 (быстрее и безопаснее RSA)
ssh-keygen -t ed25519 -C "[email protected]"
# Система спросит путь (нажми Enter для ~/.ssh/id_ed25519)
# и пароль для ключа (рекомендуется поставить, можно оставить пустым)
Шаг 3: добавить публичный ключ на сервер:
Если это GitHub или GitLab — вставь содержимое ~/.ssh/id_ed25519.pub в настройках аккаунта (Settings → SSH Keys).
Если это собственный сервер:
# Скопировать публичный ключ на сервер
ssh-copy-id [email protected]
# Или вручную добавить в authorized_keys
cat ~/.ssh/id_ed25519.pub | ssh [email protected] "cat >> ~/.ssh/authorized_keys"
Шаг 4: проверить подключение:
# Для GitHub
ssh -T [email protected]
# Hi username! You've successfully authenticated...
# Для GitLab
ssh -T [email protected]
# Welcome to GitLab, username!
Шаг 5: убедиться что git использует SSH:
# Проверить URL репозитория
git remote -v
# origin [email protected]:username/project.git (fetch) ← SSH
# origin https://github.com/username/project.git ← HTTPS
# Если HTTPS и хочешь SSH — поменять URL
git remote set-url origin [email protected]:username/project.git
GitHub и GitLab: современный подход #
Для большинства команд в 2026 году нет смысла поднимать собственный Git-сервер. GitHub и GitLab предоставляют всё необходимое:
GitHub — крупнейший хостинг для публичных open source проектов. Бесплатные приватные репозитории для команд до 3 человек, платные тарифы для организаций.
GitLab — можно использовать как облачный сервис (gitlab.com) или развернуть на собственном сервере (self-hosted). Отличается более широкими возможностями для CI/CD из коробки.
Создать удалённый репозиторий на GitHub и подключить локальный:
# 1. Создай репозиторий на github.com через веб-интерфейс
# 2. Подключи локальный репозиторий к созданному
git remote add origin [email protected]:username/new-repo.git
# 3. Отправь первый коммит
git push -u origin main
# -u устанавливает upstream: следующие разы достаточно просто git push
Создать удалённый репозиторий через GitHub CLI:
# Установить gh CLI: brew install gh (macOS) или apt install gh (Linux)
gh auth login
gh repo create my-project --public --source=. --remote=origin --push
Частые ошибки #
«Permission denied (publickey)» — Git не может подключиться по SSH:
ssh -T [email protected]
# Permission denied (publickey)
# Проверить что ключ добавлен в ssh-agent
ssh-add -l
# Если пусто:
ssh-add ~/.ssh/id_ed25519
# Проверить что публичный ключ добавлен на GitHub/GitLab
# Settings → SSH and GPG keys
«remote: Repository not found» — опечатка в URL или нет прав:
# Проверить URL
git remote -v
# Исправить URL
git remote set-url origin [email protected]:CORRECT-username/CORRECT-repo.git
«fatal: refusing to merge unrelated histories» — при первом push в непустой удалённый репозиторий:
# Разрешить слияние несвязанных историй
git pull origin main --allow-unrelated-histories
# Разреши конфликты если есть, затем
git push origin main
«Updates were rejected» — кто-то запушил изменения раньше тебя:
# Сначала забери изменения с сервера
git pull origin main
# Разреши конфликты если есть
git push origin main
Часто задаваемые вопросы #
Чем отличается git clone от git pull? #
git clone — первичная операция: скачивает весь репозиторий с сервера и создаёт локальную копию. git pull — операция синхронизации: скачивает и сливает новые изменения из удалённого репозитория в уже существующий локальный.
Зачем нужен bare-репозиторий если есть GitHub? #
Bare-репозиторий нужен когда поднимаешь собственный Git-сервер. GitHub и GitLab внутри тоже используют bare-репозитории, просто скрывают эту деталь. Если нужен быстрый внутренний сервер без лишних сервисов — bare-репозиторий + SSH это минимальное и надёжное решение.
Что такое git init bare — это то же самое что git init –bare? #
Да, git --bare init и git init --bare — одно и то же. Обе команды создают bare-репозиторий. Современный синтаксис: git init --bare.
Как изменить URL удалённого репозитория? #
git remote set-url origin [email protected]:username/new-repo.git
Это полезно при переносе репозитория или переходе с HTTPS на SSH.
Нужен ли SSH если есть HTTPS? #
HTTPS удобен для одноразового клонирования публичных репозиториев. Для регулярной работы (постоянные push/pull) SSH предпочтительнее: не нужно вводить токен при каждой операции. Настройка SSH занимает 5 минут и окупается в первый же день.