Миграция git svn фиксирует с перемещенными и перемещенными коммитами

Мы пытаемся перенести наш основной исходный репозиторий из svn в git. Моя первая попытка была просто сделать клон git svn. После того, как клонирование было завершено, я обнаружил, что первый коммит произошел в ноябре 2012 года. Я точно знаю, что коду уже пару лет. Изучая репозиторий svn, похоже, что первый коммит в основной каталог произошел в ноябре 2012 года, а несколько файлов в репо были переданы за много лет до этого. Так, как файлы в каталоге могут быть переданы перед родительским каталогом..

Я спрашивал вокруг, так как я новичок в компании, и никто не знает наверняка, но в этом репо произошло несколько перемещений svn и svn необычным образом, например, они превратились в филиал, а затем переместили этот филиал как каталог внутри транка, или превращенный в ветку, затем переименованный в эту ветку как транк и так далее.

Я выбрал один из тех старых коммитов, которые произошли до ноября 2012 года и могут быть запрошены с помощью git log, и попытался

svn up -r 599 http://myrepo/trunk

и получил ошибку:

svn: E195012: Unable to find repository location for 'http://myrepo/trunk' in revision 559

Эта ошибка воспроизводима для всех коммитов до ноября 2012 года, то есть тех, которые могут быть запрошены с помощью журнала SVN, но не могут быть извлечены

Хорошей новостью является то, что я могу сделать что-то вроде:

svn diff -r 599 http://myrepo/trunk

Мой следующий подход - запускать все коммиты с использованием svn diff, создавать патчи и применять их к git с использованием оригинального автора, даты и т. Д.

Есть лучшие идеи, как извлечь такие испорченные коммиты?

У меня нет физического доступа к репо, и я не могу использовать svnadmin

Изменить 1:

Оказалось, что я не запрашивал корневой каталог, а на один уровень ниже по дереву, поэтому я получал такие ошибки. В любом случае я сделал svnrdump и преуспел в создании дампа всего хранилища (> 32K коммитов), также репо содержало поврежденные коммиты, которые мне пришлось пропустить.

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

По сути, репо имел очень хаотическую структуру, что-то вроде

svn 
   |_Project1 
         |_subproject1 
               |_branches 
                      |_branch1 
                      |_branch2 
               |_trunk 
               |_tags 
                      |_tagv1 
   |_Non-JavaProject 
         |_subproject 
   |_Project2 
          |_AnotherSubproject 
               |_SubSubproject 
          |_Subproject2 
               |_branches 
               |_tags 
          |_Subproject3 
               |_trunk 
          |_Subproject4 
               |_Subsubproject 
                       |_branches 
                       |_tags 
                       |_trunk

Что произошло потом, так это то, что с использованием смеси SVN MV и копирования, структура была немного усовершенствована

svn |_mainProject |_trunk |_branches |_tags

Так что теперь у нас есть пути, как

mainProject/trunk/_Project1
mainProject/trunk/_Project1/subproject1
mainProject/trunk/Project2/AnotherSubproject/SubSubproject 

и то же самое касается веток / тегов

Другими словами, мне нужно определить в.git/config в fetch и других заголовках метод, чтобы разные каталоги из mainProject следовали разным (множественным) старым путям.

Это возможно?

1 ответ

В ветвях SVN, включая транки, по сути, это просто каталоги в репозитории. Один из способов выяснить, где были ваши файлы до r599, - запустить журнал в корне репозитория SVN в подробном режиме. Т.е. svn log -v http://myrepo/@599 Он покажет вам все коммиты и пути, к которым они обращались до r599 в этом хранилище, включая коммиты для веток, переименования и т. Д. Одним из них будет коммит, который перемещал каталоги. Это поможет вам, где файлы были до этого коммита, и вы можете извлечь предыдущую ревизию из ее старого местоположения.

Другие вопросы по тегам