2013-11-22 4 views
2

У меня есть SVN -репозиторий, который я бы хотел преобразовать в git -репозиторий. Для этого я использую svn2git. К сожалению, похоже, что у инструмента возникают проблемы с правильной загрузкой тегов. Мой SVN -repository выглядит следующим образом:svn2git не удалось правильно импортировать теги

.../branches 
.../tags 
     project-version-5.2.5/ 
     project-version-5.3.0/ 
     project-version-5.3.1/ 
     project-version-5.4.0/ 
     project-version-5.5.0/ 
     project-version-5.5.1/ 
     project-version-5.5.2/ 
     project-version-5.5.3/ 
     project-version-5.5.4/ 
     project-version-5.6.0/ 
     project-version-5.6.1/ 
     project-version-5.6.2/ 
     project-version-5.6.3/ 
     project-version-5.6.4/ 
     project-version-5.6.5/ 
     project-version-5.6.6/ 
     project-version-6.0.0/ 
     project-version-6.0.1/ 
     project-version-6.0.2/ 
     project-version-6.1.0/ 
     project-version-6.1.1/ 
     project-version-6.1.2/ 
     project-version-6.2.0/ 
     project-version-6.2.1/ 
.../trunk 

Но репозиторий не представляя это. Теги выглядят так:

bash:~$ git tag 
project-version-5.2.5 
project-version-5.3.0 
project-version-5.3.1 
[email protected] <-- I have no idea, where that is coming from... 
project-version-5.4.0 
project-version-5.5.0 
project-version-5.5.1 
project-version-5.5.2 
project-version-5.5.3 
project-version-5.5.4 
project-version-5.6.0 
project-version-5.6.1 
project-version-5.6.2 
project-version-5.6.3 
project-version-5.6.4 
project-version-5.6.5 

Обратите внимание на отсутствующие теги. Они по какой-то причине хранятся как удаленные ветви:

bash:~$ git branch -r 
    svn/tags/[email protected] <-- Yay, random numbers! 
    svn/tags/project-version-5.6.6 
    svn/tags/[email protected] <-- And another one. 
    svn/tags/project-version-6.0.0 
    svn/tags/project-version-6.0.1 
    svn/tags/project-version-6.0.2 
    svn/tags/project-version-6.1.0 
    svn/tags/project-version-6.1.1 
    svn/tags/project-version-6.1.2 
    svn/tags/project-version-6.2.0 
    svn/tags/project-version-6.2.1 
    svn/trunk 

Что здесь происходит?

Edit: Я забыл добавить свою команду: svn2git http://path/to/repository --no-minimize-url --verbose --username='username' --trunk trunk --nobranches --tags tags

edit2: Я только что проверил и обнаружил, что, казалось бы, случайные числа на самом деле изменения в SVN -repository, которые теги были сделаны из. Это странно, что только 3 из ~ 20 тегов получают добавленную к ним ревизию ...

Редактирование 3: Очевидно, проблема связана с комментарием одного тега, который содержит ". Все теги после этого один сохраняются как ветви, потому что svn2git не избежать " и пытается сделать что-то вроде

git tag -a -m "blablabla "blablabla"." "[email protected]" "svn/tags/[email protected]" 

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

Edit4: Я нашел решение проблемы с экранированием. Функция escape-функции в источнике svn2git просто немного странна ... Она заменяет только одинарные кавычки (') с '\''. Я закончил ...

ответ

1

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

  1. locate migration.rb - В моем случае это было в /var/lib/gems/1.9.1/gems/svn2git-2.2.2/lib/svn2git/migration.rb
  2. Найти определение escape_quotes() (в настоящее время можно найти в строках 335-337)
  3. Добавить .gsub("\"", "\\\"") к телу

Я надеюсь, это поможет кому-то с той же проблемой, какое-то время :)

+0

Где находится нить github? У меня такая же проблема, но мы так много лет спустя. Теперь код немного по-разному, и он содержит 'str.gsub (/ '|" /) {| c | "\\ # {c}"} 'в теле, но я не знаю рубина, достаточно хорошо знаю, что я должны измениться. можете ли вы мне помочь? – lvthillo

1

Я нашел этот вопрос, когда я также задавался вопросом об этих тегах @nnn. Так что если кто-то ищет то же это описано в git svn manual:

Если мерзавец СВН сконфигурирован для извлечения ветви (и --follow-ветви действует), иногда создает несколько ветвей Git для одного СВН ветвь, где дополнительные ветви имеют имена формы branchname @ nnn (с nnn номером ревизии SVN).Эти дополнительные ветви создаются, если git svn не может найти родительский фиксатор для первого коммита в ветви SVN, чтобы связать ветвь с историей других ветвей.