↓Перейти к содержанию
  1. Архив/

Удалённые репозитории Git: SSH, push и bare-репозитории

··7 минут·

Удалённые репозитории в 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 минут и окупается в первый же день.


Читай также #