- Андрей Куманяев/
- Git: руководства и команды/
- Протоколы передачи данных Git: HTTP, SSH, git:// и локальный/
Протоколы передачи данных Git: HTTP, SSH, git:// и локальный
Git поддерживает четыре протокола для передачи данных между репозиториями: локальный файловый, HTTP/HTTPS, SSH и git://. Каждый имеет свои преимущества, ограничения и типичные случаи использования. Протокол определяет URL репозитория при клонировании.
HTTPS протокол #
HTTPS — самый универсальный протокол. Работает везде, где есть доступ к интернету, не требует настройки на клиенте:
# Клонирование через HTTPS
git clone https://github.com/user/project.git
git clone https://gitlab.com/user/project.git
# Push требует аутентификации
git push origin main
# Username for 'https://github.com': user
# Password for 'https://[email protected]': <токен>
# Кешировать учётные данные (не хранить в файле)
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# Хранить в системном хранилище паролей
git config --global credential.helper osxkeychain # macOS
git config --global credential.helper manager # Windows
git config --global credential.helper libsecret # Linux GNOME
GitHub и GitLab больше не принимают пароли — только Personal Access Tokens. Token используется вместо пароля при аутентификации.
SSH протокол #
SSH — предпочтительный протокол для разработчиков. Аутентификация через ключи, не требует ввода пароля при каждой операции:
# Клонирование через SSH
git clone [email protected]:user/project.git
git clone [email protected]:user/project.git
git clone ssh://[email protected]/user/project.git # альтернативный формат
# Настройка SSH ключа
ssh-keygen -t ed25519 -C "[email protected]"
# Публичный ключ: ~/.ssh/id_ed25519.pub
# Добавить в GitHub: Settings → SSH and GPG keys → New SSH key
# Проверить подключение
ssh -T [email protected]
# Hi username! You've successfully authenticated...
# Несколько аккаунтов: настройка ~/.ssh/config
cat >> ~/.ssh/config << 'EOF'
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
EOF
# Использовать разные аккаунты
git clone git@github-work:company/project.git
git clone git@github-personal:myuser/personal.git
Локальный протокол #
Для репозиториев на том же компьютере или в локальной сети:
# Клонировать по пути
git clone /path/to/repo.git
git clone /srv/git/repos/project.git
# Или с явным указанием протокола
git clone file:///path/to/repo.git
# Разница file:// vs путь:
# Путь без file:// — жёсткие ссылки (быстрее, меньше места)
# file:// — полное копирование объектов
# Использовать shared репозиторий в локальной сети
git clone //server/share/repos/project.git # Windows UNC
git clone /mnt/nas/repos/project.git # смонтированный NFS
git:// протокол (git daemon) #
Специальный протокол Git. Быстрый, но без аутентификации — только для чтения публичных репозиториев:
# Клонирование через git://
git clone git://github.com/user/project.git # исторически, сейчас редко
# Запуск git daemon локально
git daemon \
--reuseaddr \
--base-path=/srv/git \
--export-all \
/srv/git
# Порт по умолчанию: 9418
# Клонировать с локального daemon
git clone git://localhost/project.git
# Разрешить конкретный репозиторий
touch /srv/git/project.git/git-daemon-export-ok
Сравнение протоколов #
Протокол Порт Аутентификация Скорость Настройка Использование
HTTPS 443 Пароль/Токен Средняя Минимум Публичные, CI/CD
SSH 22 Ключи Высокая SSH ключи Разработка
git:// 9418 Нет Высокая git daemon Публичные (read-only)
Локальный - ФС права Высокая Нет Один компьютер
Смена протокола в существующем репозитории #
# Посмотреть текущий URL
git remote -v
# origin https://github.com/user/project.git (fetch)
# origin https://github.com/user/project.git (push)
# Сменить с HTTPS на SSH
git remote set-url origin [email protected]:user/project.git
# Проверить
git remote -v
# origin [email protected]:user/project.git (fetch)
# origin [email protected]:user/project.git (push)
# Сменить с SSH на HTTPS
git remote set-url origin https://github.com/user/project.git
Проксирование #
# HTTPS через HTTP прокси
git config --global http.proxy http://proxy.example.com:8080
git config --global https.proxy https://proxy.example.com:8080
# SSH через HTTP прокси (nc или connect-proxy)
cat >> ~/.ssh/config << 'EOF'
Host github.com
ProxyCommand nc -X connect -x proxy.example.com:8080 %h %p
EOF
# Отключить прокси для конкретного хоста
git config --global http.https://internal.server.com.proxy ""
Настройка TLS/SSL #
# Использовать кастомный CA сертификат
git config --global http.sslCAInfo /path/to/ca.crt
# Отключить проверку сертификата (НЕ рекомендуется для продакшена)
git config --global http.sslVerify false
# Для конкретного репозитория
git -c http.sslVerify=false clone https://internal.server/repo.git
# Указать сертификат клиента
git config --global http.sslCert /path/to/client.crt
git config --global http.sslKey /path/to/client.key
Smart vs Dumb HTTP #
Git поддерживает два варианта HTTP:
# Dumb HTTP (только чтение, статические файлы)
# Требует git update-server-info на сервере
# URL: https://example.com/repo.git
# Smart HTTP (чтение и запись, требует CGI/WSGI)
# Поддерживает push и аутентификацию
# Используют GitHub, GitLab, Bitbucket
# Проверить тип
git ls-remote https://example.com/repo.git
Часто задаваемые вопросы #
SSH или HTTPS — что выбрать? SSH предпочтительнее для регулярной разработки — один раз настроил ключи и больше не вводишь пароли. HTTPS проще для одноразовых операций и CI/CD (токены в переменных окружения).
Почему SSH работает медленнее HTTPS на некоторых серверах? SSH имеет overhead на установку соединения. Для крупных переносов данных разница незначительна. HTTPS с HTTP/2 иногда быстрее для большого количества объектов.
Как настроить SSH если стандартный порт 22 заблокирован? GitHub и GitLab поддерживают SSH через порт 443: ssh.github.com на порту 443. Добавьте в ~/.ssh/config: Host github.com; Hostname ssh.github.com; Port 443.
Что делать если HTTPS не работает за корпоративным прокси? Настройте http.proxy в git config. Или используйте SSH через прокси с ProxyCommand в ~/.ssh/config.
Можно ли использовать git:// для приватных репозиториев? Нет. git:// протокол не поддерживает аутентификацию. Только SSH или HTTPS для приватных репозиториев.
Заключение #
Для ежедневной разработки используйте SSH — один раз настроили ключ и работаете без паролей. Для CI/CD и автоматизации — HTTPS с токенами. git:// протокол подходит только для публичных репозиториев только для чтения. Порт SSH можно поменять — подробнее о портах Git.