Как восстановить удаленный Git-репозиторий
У нас был Gitlab CE на виртуальной машине на нашем сервере.
На одном сервере Gitlab работало 3 человека.
Этот Gitlab CE vm был удален случайно! Эти 3 человека все еще имеют свои локальные репозитории с большим количеством веток.
Наша стратегия ветвления была такой:
У нас была ветка Master и несколько веток функций на пользователя.
пользователи привыкли:
- вытащить мастера с пульта,
- сделай из него ветку,
- вносить изменения,
- нажмите, чтобы освоить снова (с помощью запросов на слияние)
Теперь у меня есть несколько вопросов:
- Есть ли способ-стратегия воссоздать-восстановить удаленного репо из локальных?
- Если нет, что я должен сделать, чтобы создать еще один удаленный репозиторий и объединить все коммиты с ним?
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