Как восстановить удаленный Git-репозиторий

У нас был Gitlab CE на виртуальной машине на нашем сервере.
На одном сервере Gitlab работало 3 человека.
Этот Gitlab CE vm был удален случайно! Эти 3 человека все еще имеют свои локальные репозитории с большим количеством веток.
Наша стратегия ветвления была такой:
У нас была ветка Master и несколько веток функций на пользователя.
пользователи привыкли:

  • вытащить мастера с пульта,
  • сделай из него ветку,
  • вносить изменения,
  • нажмите, чтобы освоить снова (с помощью запросов на слияние)

Теперь у меня есть несколько вопросов:

  1. Есть ли способ-стратегия воссоздать-восстановить удаленного репо из локальных?
  2. Если нет, что я должен сделать, чтобы создать еще один удаленный репозиторий и объединить все коммиты с ним?

3 ответа

Решение
  • Создайте пустой репо в GitLab/BitBucket/GitHub.

  • Добавить новый пульт (скажем, another) в вашем текущем репо с URL нового репо. Затем подтолкнуть master ветвь фиксирует / изменяет another Основная ветка репо.

    $ git remote add another <new-repo-url>
    $ git remote -v                 # see if the remote is added correctly 
    $ git checkout master
    
    $ git push another master       # push the changes to another/master
    
  • Если вам нужны функции другой ветки (скажем, feature) тогда просто checkout к feature ветвь и нажмите на изменения another репо feature ветка.

    $ git checkout feature
    $ git push another feature      # push changes to 'another' repo's 'feature' branch
    
  • Нажмите на все branches а также tags в another Сделки РЕПО.

    $ git push --all --tags another
    

NB здесь, another представляет URL вашего нового репо.

Так как ваш пульт был удален, у вас еще нет источника, поэтому вам придется извлекать "удаленные" ветви локально и назначать им исходное имя, а затем выдвигать все ветви на пульт.

Если вы не хотите, чтобы местные филиалы просто выдвигали те, которые вам нужны.

Вот скрипт, который я использую, чтобы оформить все ветки и затем отправить их на новый пульт.

#!/bin/bash

# add the new origin 
git remote add origin2 <url>

# loop over all the original branches and set the new remote as the new track origin
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
    git branch --track ${branch#remotes/origin2/} $branch
done

# now push all branches and tags
git push origin2 --all    
git push origin2 --tags

Что делает скрипт?

git branch -a
получить список всех местных отделений

| grep remotes Имена ветвей: 'remotes/origin/', так что это удалит удаленные из имен ветвей

| grep -v HEAD | grep -v master
удалить master (текущую ветку) и HEAD, который является псевдонимом для последнего коммита

Вы можете скопировать (или клонировать --bare) один из локальных репозиториев и перебазировать / удалить коммиты, которые не были объединены с удаленным репо. После этого вы можете использовать этот как удаленный.

Я случайно удалил свою ветку на "origin". Но у меня осталась локальная копия. Вот как я воссоздал ветку по origin:

Когда я переключился на локальную копию, я увидел такое сообщение:

Switched to branch 'my-special-branch'
Your branch is based on 'origin/my-special-branch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Я использовал:

git branch --unset-upstream

Это вернуло ветку в нормальное нерасположенное состояние. Чтобы вернуть его в исходное состояние, я просто побежал

git push --set-upstream origin my-special-branch
Другие вопросы по тегам