svn2git не может правильно импортировать теги

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

.../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

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

bash:~$ git tag
project-version-5.2.5
project-version-5.3.0
project-version-5.3.1
project-version-5.3.1@3812 <-- 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/project-version-5.6.5@4990 <-- Yay, random numbers!
  svn/tags/project-version-5.6.6
  svn/tags/project-version-5.6.6@5620 <-- 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

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

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

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

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

git tag -a -m "blablabla "blablabla"." "project-version-5.6.5@4990" "svn/tags/project-version-5.6.5@4990"

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

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


person Vince    schedule 22.11.2013    source источник


Ответы (2)


Я исправил проблему, добавив экранирование двойных кавычек. Поскольку это изменение уже было предложено 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("\"", "\\\"") к телу

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

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

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

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

person Zitrax    schedule 12.01.2016