Git - случайно переписал всю историю коммитов удаленного репозитория - PullRequest
3 голосов
/ 23 мая 2011

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

  1. Клонировал удаленный репозиторий Git
  2. Выполнен ряд команд для импорта репозитория Git в SVN.

    а. Я испробовал множество методов, найденных через stackoverflow и в нескольких других местах, используя локальный репозиторий SVN в качестве теста. Большинство из них потерпели неудачу, учитывая репозиторий Git, против которого я их запускал. Тем не менее, набор шагов, найденных в http://eikke.com/importing-a-git-tree-into-a-subversion-repository/, оказался успешным, так что это то, что я использовал в конце.

    б. Это было только полу-успешным. При импорте в SVN была предпринята попытка получить всю историю коммитов git и импортировать ее как журналы фиксации SVN, но она не удалась, когда прошло около 2/3 пути. Последняя треть была передана в SVN как единый коммит. Кроме того, все даты фиксации были перезаписаны на текущую дату, а большая часть авторов была перезаписана. Учитывая, что это было в репозитории SVN, а не в репозитории Git, я не был слишком обеспокоен.

  3. Если бы кто-то проверил код из SVN, внес изменения и зафиксировал его.
  4. Использовал git svn для получения изменения
  5. Перенес изменения в удаленный репозиторий.

Конечным результатом было то, что вся история коммитов была перезаписана тем, что сейчас есть в SVN. Таким образом, даты и авторы изменений были изменены, а последние 1/3 истории были потеряны. Можно ли восстановить?

Если нет, я нашел резервную копию локального репозитория, которую я сделал где-то в середине процесса. Кажется, у него есть вся оригинальная история коммитов. Можно ли как-то перезаписать данные коммита в удаленном репозитории тем, что есть в этой локальной резервной копии?

1 Ответ

1 голос
/ 24 мая 2011

Если вы перенесли изменения на пульт, вы ничего не перезаписали;В конце концов, это контроль версий.Вы должны быть в состоянии восстановить состояние пульта, сбросив HEAD туда, где он был до того, как вы что-то сделали.Предполагая, что я не пойму неправильно, что вы сделали, все, что вам действительно нужно сделать, это что-то вроде

git checkout <SHA-of-old-head>
git add -A
git commit
git push

... и вы вернетесь туда, откуда начали, хотя ваш провал останетсяИстория пульта.Если вы этого не хотите, вам нужно работать непосредственно с пультом и переместить ГОЛОВУ туда, где она была.

...