Как перенести репозиторий с GitLab на Github

Необходимо перенести весь код из одного удаленного репозитория в другой и сохранить всю историю? Это сделать несложно, всего достаточно несколько git команд

Предположим, у вас есть репозиторий на GitLab. Это может быть как основной сайт gitlab.com, так и любой сервер с развернутым GitLab. Благодаря, что такие git хранилища как Github, GitLab или Bitbacket используют git протокол - принцип работы с ними одинаковый. А значит использую консольные команды гита возможно сделать любые действия и они будут работать одинаково. Этим и воспользуемся.

Перенос используя git команды

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

Рекомендуется использовать SSH доступ к репозиторию, как это сделать в статье “Переходим с HTTPS на SSH доступ в GitHub”

Клонируйте репозиторий с GitLab

git clone git@gitlab.com:shibkov.k/sjc_platform.git

Копировать можно как через https, так и через ssh. Это не имеет значения. Важно, чтобы в директории где выполняете команду, не было папки sjc_platform - а это будет ошибка.

  • Переходите в папку с клонированным репозиторием

В данном случае это sjc_platform

cd sjc_platform

И давайте посмотрим с какими удаленными репозиториями связан ваш локальный репозиторий:

git remote -v

Пример вывода:

> git remote -v
origin git@gitlab.com:shibkov.k/sjc_platform.git (fetch)
origin git@gitlab.com:shibkov.k/sjc_platform.git (push)

Есть две записи, но репозиторий один - origin, и он ведет на GitLab. Этот репозиторий используется для получения обновлений и для отправки кода в GitLab по умолчанию при командах push.

Зачем нужна команда fetch - можете прочитать в коротких заметках.

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

Создайте репозиторий на Github

Заходите в Github, начните процесс создания нового репозитория. Важно создать полностью чистый репозиторий, без содержимого.

Перед созданием, вам предложат сделать первоначальные настройки, на что обратить внимание:

  • имя репозитория - можете указать точно такое же или на свой вкус.
  • публичный или приватный - значения не имеет
  • не создавайте README файл
  • не добавляйте gitignore файл
  • не выбирайте лицензию

Пример на скриншоте:

new git repo!

После создания вам откроется по-сути эта инструкция, для загрузки существующего репозитория, но некоторые команды надо изменить. Все равно проведу вас до конца 😊

Загрузка локального репозитория на Github

Мы используем сценарий “push an existing repository from the command line”.

Все команды выполняйте в консоли, находясь в корне директории склонированного репозитория:

  1. Добавляем новый remote (связь с удаленным репозиторием)

Тут важно изменить имя origin, например на github. Так как origin remote уже у нас есть, второй не даст добавить.

git remote add github git@github.com:sendelufa/sjc_platform.git

После, проверьте что успешно добавился новый remote:

> git remote -v
github git@github.com:sendelufa/sjc_platform.git (fetch)
github git@github.com:sendelufa/sjc_platform.git (push)
origin git@gitlab.com:shibkov.k/sjc_platform.git (fetch)
origin git@gitlab.com:shibkov.k/sjc_platform.git (push)

Отлично, мы убедились - новый remote добавился.

  1. В инструкции предлагается изменить существующую ветку на main.

Команда git branch -M main или полный формат git branch --move --force переименовывает текущую ветку в main. А ветку у нас уже точно есть, менять нет никакой необходимости, пропускаем.

  1. Загружаем

Если вы хотите чтобы ветки в вашем репозитории и на удаленном не изменили название, посмотрите заранее как называется у вас текущая ветка:

git branch --show-current

Пример вывода, у меня master ветка:

> git branch --show-current
master

Теперь используем команду отправки ветки на удаленный репозиторий:

git push -u github master

После -u указываете имя remote, у нас это github и после ветку которая будет создана в удаленном репозитории и будет в нее загружена текущая локальная ветка, у нас это master.

Это снова краткая запись, без сокращений это git push --set-upstream github master.

Пример, результата выполнения команды:

> git push --set-upstream github master
Enumerating objects: 428, done.
Counting objects: 100% (428/428), done.
Delta compression using up to 8 threads
Compressing objects: 100% (176/176), done.
Writing objects: 100% (428/428), 115.22 KiB | 776.00 KiB/s, done.
Total 428 (delta 158), reused 428 (delta 158), pack-reused 0
remote: Resolving deltas: 100% (158/158), done.
To github.com:sendelufa/sjc_platform.git
 * [new branch]      master -> master
branch 'master' set up to track 'github/master'.

🎆 Это явный успех, теперь вы можете открыть страницу репозитория на Github и убедиться - он уже заполнен всей вашей историей коммитов.

У меня много веток! Как быть?

Если вам надо загрузить сразу все ветки, то вместо команды git push --set-upstream github master используйте:

git push --all github

⭐ Бонус

Если вы захотите удалить remote гитлаба, то вот вам команда для нашего примера:

git remote remove origin

и у вас останется только один remote

> git remote -v
github	git@github.com:sendelufa/sjc_platform.git (fetch)
github	git@github.com:sendelufa/sjc_platform.git (push)

ну и последнее, если вы хотите переименовать github remote в origin:

git remote rename github origin

После rename указывайте название существующего remote и после новое имя.

Таким же образом можно переносить и с Github на Gitlab или в любое другое git хранилище. Удачного кодинга!

Создано при помощи Hugo
Тема Stack, дизайн Jimmy