Как бороться с Mercurial, когда повреждение / восстановление диска вернул мастер-репо в старое состояние - PullRequest
3 голосов
/ 16 февраля 2012

Интересно, кто-нибудь может дать мне совет о том, как справиться с последствиями повреждения одного из наших дисков и восстановления его в старое состояние?Вот история:

У меня есть код, которым я управляю с помощью Mercurial.На диске A имеется «главный» репозиторий, а на диске B. - ветвь / клон. Временная шкала выглядит следующим образом:

  1. Начните с главного репозитория.Существуют различные существующие ветви / клоны для создания прототипов новых функций.
  2. клон главного репо на диске A -> еще одна новая ветвь на диске B
  3. фиксирует изменения в главном репо и передает в новую ветку
  4. диск A поврежден
  5. диск A восстановлен в состояние в момент времени 1.
  6. Диск B не поврежден

Что мне делать?

Вариант 1: - С момента ветвления произошло очень мало изменений.Так что просто сдуйте мастер репо и начните использовать новую ветку в качестве моего нового мастера.Если я сделаю это, не возникнут ли у меня проблемы с объединением моих старых клонов (упомянутых в момент времени 0) обратно?

Вариант 2: - Просто вручную внесите изменения в мой мастер, которые были потеряны, чтобы мои сравнения с новымветка.Даже если я сделаю это, как я буду продолжать продвигаться к новой ветке?

Вариант 3: - Просто вручную внесите изменения в мой мастер, которые были потеряны, мои расхождения с новой веткой.Затем удалите новую ветку и клонируйте новую.

Любые советы приветствуют вас Zam

1 Ответ

3 голосов
/ 16 февраля 2012

Я знаю, что вы говорите, что на вопрос дан ответ, но все же позвольте мне дать несколько советов.Вы спрашиваете:

Вариант 1: С момента ветвления на ветке произошло очень мало.Так что просто сдуйте мастер репо и начните использовать новую ветку в качестве моего нового мастера.Если я сделаю это, не возникнет ли у меня проблем с объединением моих старых клонов (упомянутых в момент времени 0) обратно?

У вас не возникнет проблем со слиянием старых клонов главного репозитория.Представьте, что у вас есть мастер репо M и клоны X и Y.Допустим, они содержат такие изменения (время течет вправо):

M: [m1] --- [m2] --- [m3]

X: [m1] --- [x1] --- [x2]

Y: [m1] --- [m2] --- [y1] --- [y2]

Итак, X был клоном M, когда существовало только [m1], Y - клоном M после [m2] было сделано.Ни X, ни Y не имеет [m3] - эта ревизия была явно зафиксирована непосредственно в репозитории M при работе на сервере.

Теперь вы обнаруживаете, что диск с M неисправен ивы восстанавливаете его из резервной копии.Резервная копия имеет только [m1].Ситуация в мире теперь выглядит следующим образом:

M: [m1]

X: [m1] --- [x1] --- [x2]

Y: [m1] --- [m2] --- [y1] --- [y2]

Когда вы сравните общие ситуации, вы увидите, что отсутствует только набор изменений [m3]: это тот, которого не было ни в одном из клонов (* 1031)* и Y).

После восстановления вы можете нажать [m2] с Y до M, чтобы спасти как можно больше данных.Это делается с помощью простого

$ hg push -r m2

, где m2 - номер ревизии или рассматриваемый хэш набора изменений.

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

Обратите внимание, что вы потеряли только [m2], потому что он существовал только в клоне single ,Обычно вы создаете новые наборы изменений в локальных клонах, а затем отправляете их в главный репозиторий.Таким образом, вы автоматически получаете копию всех наборов изменений в мастере!Это затрудняет потерю наборов изменений, так как люди могут просто отодвинуть свою работу после восстановления.

...