- Андрей Куманяев/
- Git: руководства и команды/
- Как создать удалённый репозиторий Git: пошаговое руководство/
Как создать удалённый репозиторий Git: пошаговое руководство
Большинство разработчиков используют GitHub или GitLab для хостинга репозиториев. Но иногда нужен собственный сервер: для приватных проектов с жёсткими требованиями безопасности, для внутренней инфраструктуры без доступа в интернет, или просто для понимания того, как устроены удалённые репозитории изнутри.
Что такое bare репозиторий #
Обычный репозиторий Git имеет рабочую директорию (файлы проекта) и скрытую папку .git с историей. Bare (голый) репозиторий — только содержимое папки .git без рабочих файлов.
Зачем это нужно: в репозиторий, куда делают push несколько разработчиков, нельзя иметь рабочую директорию, иначе push сломает текущий checkout. Bare репозиторий — стандартный способ создания удалённого хранилища.
По соглашению, bare репозитории называются с суффиксом .git: my-project.git.
Способ 1: Bare репозиторий на сервере по SSH #
# Подключиться к серверу
ssh [email protected]
# Перейти в директорию для репозиториев
cd /var/git
# или
cd /home/git
# Создать директорию для проекта
mkdir my-project.git
cd my-project.git
# Инициализировать bare репозиторий
git init --bare
# Вывод:
# Initialized empty Git repository in /var/git/my-project.git/
# Выйти с сервера
exit
Теперь подключите локальный репозиторий к созданному:
# На локальной машине
cd ~/my-project
# Добавить remote
git remote add origin ssh://[email protected]/var/git/my-project.git
# или в сокращённом SSH формате
git remote add origin [email protected]:/var/git/my-project.git
# Проверить
git remote -v
# Отправить первый коммит
git push -u origin main
Способ 2: Локальный «удалённый» репозиторий #
Для обучения или локальной командной работы можно создать bare репозиторий прямо на своём компьютере:
# Создать директорию для «сервера»
mkdir ~/git-server
cd ~/git-server
# Создать bare репозиторий
mkdir my-project.git
cd my-project.git
git init --bare
# Подключить существующий проект
cd ~/my-project
git remote add origin ~/git-server/my-project.git
git push -u origin main
# Клонировать (как будто с другой машины)
cd ~/tmp
git clone ~/git-server/my-project.git my-project-clone
Способ 3: GitHub/GitLab через веб-интерфейс #
Для большинства команд проще создать репозиторий через веб-интерфейс:
На GitHub: кнопка «New repository» → выбрать имя → Create. Затем в локальном проекте:
git remote add origin https://github.com/username/my-project.git
git push -u origin main
На GitLab: «New project» → «Create blank project» → настроить видимость. URL подключения будет показан на странице проекта.
Клонирование из нового репозитория #
После создания bare репозитория другие разработчики могут клонировать:
# Клонировать по SSH
git clone ssh://[email protected]/var/git/my-project.git
# Клонировать в директорию с другим именем
git clone ssh://[email protected]/var/git/my-project.git local-name
# Клонировать локальный bare репозиторий
git clone ~/git-server/my-project.git
Настройка прав доступа #
Для многопользовательского доступа к bare репозиторию на сервере:
# На сервере: создать пользователя git
sudo useradd -m git
sudo mkdir /home/git/.ssh
sudo chmod 700 /home/git/.ssh
# Добавить публичные ключи разработчиков
sudo nano /home/git/.ssh/authorized_keys
# Добавить каждый публичный ключ отдельной строкой
# Установить права на директорию репозитория
sudo chown -R git:git /var/git
sudo chmod -R 775 /var/git
# Теперь разработчики подключаются как:
git clone [email protected]:/var/git/my-project.git
Создание репозитория на GitHub через веб-интерфейс #
Шаг за шагом через GitHub UI:
1. Зайти на github.com → кнопка "+" в правом верхнем углу
2. Выбрать "New repository"
3. Заполнить форму:
- Repository name: "my-project"
- Description: "Проект для управления задачами"
- Public или Private (выбрать)
- Initialize with README? (опционально)
- Add .gitignore? (выбрать язык)
- Add license? (опционально)
4. Нажать "Create repository"
5. Скопировать HTTPS или SSH URL
После создания:
# Способ 1: Если репо создано пустым
cd ~/my-project
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/username/my-project.git
git push -u origin main
# Способ 2: Если репо создано с README
git clone https://github.com/username/my-project.git
cd my-project
# готово к работе
Создание репозитория через GitHub CLI #
Быстрый способ через gh команду:
# Установить GitHub CLI
# https://cli.github.com
# Логин в GitHub
gh auth login
# Создать новый репозиторий и клонировать
gh repo create my-project --source=. --remote=origin --push
# Создать только на GitHub без локального
gh repo create my-project --public
# Создать приватный репозиторий
gh repo create my-project --private
# Создать в определённой организации
gh repo create my-org/my-project --public
Параметры gh repo create:
gh repo create [<repository>] [flags]
Flags:
-d, --description string Description of repository
-s, --source string Repository to use as template
--public Make repository public
--private Make repository private
--internal Make repository internal (enterprise only)
--enable-issues bool Enable issues (default true)
--enable-projects bool Enable projects (default true)
--enable-wiki bool Enable wiki (default true)
--allow-auto-merge bool Allow auto merge commits
--allow-squash-merge bool Allow squash merges (default true)
--allow-rebase-merge bool Allow rebase merges (default true)
--delete-branch-on-merge bool Delete branch on merge (default false)
Создание репозитория на GitLab #
Похоже на GitHub, но с отличиями:
GitLab UI:
1. Главная → "Create new project"
2. "Create blank project" (или use template)
3. Project name: "my-project"
4. Project slug: "my-project"
5. Visibility level: Private / Internal / Public
(опции отличаются от GitHub)
6. Create project
Отличия от GitHub:
- Есть "Internal" уровень (видно членам организации)
- Более детальные настройки прав доступа
- Встроенный CI/CD (GitLab CI)
- Встроенный registry для Docker
Подключение локально:
git remote add origin https://gitlab.com/username/my-project.git
git branch -M main
git push -u origin main
Создание репозитория на Bitbucket #
Для тех кто использует Atlassian:
# На bitbucket.org:
# 1. Workspace → Create repository
# 2. Repository name, Access level (Private/Public)
# 3. Scm (Git/Mercurial) → Git
# 4. Create repository
# Локально:
git remote add origin https://bitbucket.org/username/my-project.git
git push -u origin main
Репозиторий: Private vs Public #
Рекомендации по выбору:
Выбирайте PRIVATE если:
✓ Коммерческий проект
✓ Чувствительные данные
✓ Приватный GitHub Codespaces
✓ Приватные DevOps скрипты
✓ Не готовы к открытому коду
Выбирайте PUBLIC если:
✓ Open source проект
✓ Портфолио для работодателей
✓ Образовательный проект
✓ Инструмент для других разработчиков
✓ Нет проблем если код скопировать
Изменить видимость позже:
# GitHub UI: Settings → Danger Zone → Change visibility
# GitLab UI: Settings → General → Visibility
Инициализация README, .gitignore и License #
При создании репозитория можно выбрать:
README.md:
# My Project
Краткое описание проекта
## Установка
```bash
git clone ...
cd my-project
npm install
Использование #
…
Лицензия #
MIT
**.gitignore по языку:**
Выбрать при создании:
- Node
- Python
- Java
- Go
- и т.д.
Или добавить вручную: git clone https://github.com/github/gitignore.git cp gitignore/Node.gitignore .gitignore git add .gitignore git commit -m “Add .gitignore”
**Лицензия:**
Популярные лицензии:
- MIT (простая, требует указание авторства)
- Apache 2.0 (явно покрывает patent rights)
- GPL 3.0 (open source код остаётся open source)
- BSD (MIT с доп гарантиями)
- Proprietary (свой текст лицензии)
GitHub автоматически создаст файл LICENSE.md
## Инициализация существующего проекта
```bash
# Если у вас есть локальный проект без Git
cd ~/existing-project
# Инициализировать локальный репо
git init
git add .
git commit -m "Initial commit"
# Создать bare репозиторий на сервере
ssh [email protected] "mkdir -p /var/git/my-project.git && git init --bare /var/git/my-project.git"
# Добавить remote и отправить
git remote add origin [email protected]:/var/git/my-project.git
git push -u origin main
Практические примеры #
# Создать bare репозиторий одной командой
ssh user@server "git init --bare /var/git/project.git"
# Клонировать с SSH
git clone [email protected]:/var/git/project.git
# Просмотр содержимого bare репозитория
ls /var/git/project.git
# HEAD branches config description hooks info objects packed-refs refs
# Изменить URL после переноса репозитория
git remote set-url origin ssh://new-server/var/git/project.git
# Синхронизировать старый и новый сервер
git clone --mirror old-server:/var/git/project.git
cd project.git
git remote set-url --push origin new-server:/var/git/project.git
git push --mirror
Трансфер владения репозиторием #
Если нужно передать репозиторий другому пользователю:
GitHub:
1. Settings → Danger Zone → Transfer ownership
2. Выбрать нового владельца
3. Ввести имя репозитория для подтверждения
4. Нажать "I understand, transfer this repository"
GitLab:
1. Settings → General → Advanced
2. "Transfer project"
3. Выбрать группу/пользователя
4. Нажать "Transfer project"
После трансфера:
# Обновить remote URL в локальном репо
git remote set-url origin https://github.com/new-owner/my-project.git
# Проверить
git remote -v
Клонирование сразу после создания #
После создания репозитория на GitHub/GitLab:
# Вариант 1: Клонировать пустой репо
git clone https://github.com/username/my-project.git
cd my-project
# Добавить файлы
git add .
git commit -m "Initial commit"
git push origin main
# Вариант 2: Если репо уже содержит README
git clone https://github.com/username/my-project.git
cd my-project
# Уже готово к работе
# Вариант 3: Клонировать с другим именем локальной папки
git clone https://github.com/username/my-project.git my-local-folder
cd my-local-folder
Настройки репозитория после создания #
Рекомендуемые настройки:
GitHub Settings → General:
✓ Default branch: main
✓ Require status checks before merging: ON
✓ Dismiss approved reviews: ON
✓ Require code review before merging: ON
✓ Require number of approvals: 1
✓ Allow auto-merge: ON (если используете)
✓ Always suggest updating PR branches: ON
GitHub Settings → Branches:
1. Add rule
2. Branch name pattern: main
3. Require pull request reviews before merging
4. Require status checks to pass
5. Require branches to be up to date
6. Include administrators: ON
GitHub Settings → Collaborators & teams:
Добавить членов команды с нужными правами:
- Pull only: для внешних контрибьюторов
- Triage: для тех кто может labeling
- Write: для разработчиков
- Maintain: для lead разработчиков
- Admin: для владельцев
GitHub Settings → Secret and variables:
Добавить GitHub secrets для CI/CD:
- DEPLOY_KEY: SSH ключ для деплоя
- DOCKER_TOKEN: Docker Hub credentials
- API_TOKEN: Внешний API ключ
Подключение существующего локального репо к новому удалённому #
# У вас есть локальный репо без remote
# Способ 1: Добавить remote
cd ~/my-existing-project
git remote add origin https://github.com/username/my-project.git
git branch -M main
git push -u origin main
# Способ 2: Если у вас develop ветка
git branch -M develop main # переименовать
git push -u origin main
# Способ 3: Если у вас несколько веток
git branch -a # посмотреть все ветки
git push -u origin main
git push -u origin develop
git push --all origin
git push --tags origin
Зеркалирование между хостингами #
Если нужно синхронизировать репозиторий между GitHub и GitLab:
# Способ 1: Using mirror clone
git clone --mirror https://github.com/username/project.git
cd project.git
git push --mirror https://gitlab.com/username/project.git
# Способ 2: Синхронизировать локально
git clone https://github.com/username/project.git
cd project
git remote add gitlab https://gitlab.com/username/project.git
git push gitlab main
git push gitlab --all
git push gitlab --tags
# Способ 3: GitHub Actions для автосинхронизации
# .github/workflows/mirror.yml
name: Mirror to GitLab
on:
push:
branches: ['**']
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Push to GitLab
run: git push --mirror https://oauth2:${{ secrets.GITLAB_TOKEN }}@gitlab.com/username/project.git
Часто задаваемые вопросы #
Что такое bare репозиторий и почему он необходим? Bare репозиторий содержит только данные Git (историю, ветки, теги) без рабочей директории. Это стандарт для удалённых репозиториев, так как в них нельзя иметь рабочие файлы — иначе push сломает текущее состояние.
Можно ли использовать обычный репозиторий вместо bare? Технически да, но push будет выдавать предупреждения, а текущая ветка не обновится. Для многопользовательского использования всегда используйте --bare.
Как дать доступ к репозиторию другим пользователям? Через SSH: добавить их публичные ключи в ~/.ssh/authorized_keys пользователя сервера. Через HTTP: нужен Git HTTP backend (git-http-backend) или GitLab/Gitea.
Какой протокол использовать: SSH или HTTP? SSH удобнее для разработчиков (не нужно вводить пароль с настроенными ключами), надёжнее и безопаснее. HTTP лучше для публичного доступа на чтение.
Как настроить SSH доступ к удалённому репозиторию? Настройте SSH-ключи: ssh-keygen, добавьте публичный ключ на сервер в authorized_keys. Подробнее — в статье о подключении по SSH.
Заключение #
Создать удалённый Git репозиторий несложно: git init --bare на сервере, git remote add в локальном проекте, git push -u origin main. Для большинства команд GitHub или GitLab удобнее и не требуют собственной инфраструктуры. Для управления remote репозиториями используйте git remote add и git remote -v.