Подтвердить что ты не робот

Как сохранить временные метки времени при преобразовании репозитория из Mercurial в Subversion?

Из-за рабочих политик я вынужден использовать Subversion. В настоящее время я разработал некоторый код с использованием Mercurial, и мне нужно преобразовать этот репозиторий в новый репозиторий Subversion. В текущем репозитории Mercurial также содержатся части старого кода, которые я скопировал из другого репозитория SVN (драйвер HW), и этот код содержит ключевые слова (например, $Id: ...$), которые были расширены, когда я скопировал код.

Мой текущий подход к преобразованию:

hg convert --dest-type svn repository.hg repository.svn

Это работает, к сожалению, не сохраняет отметки времени Mercurial версий. Кроме того, он расширяет теги в некоторых устаревших частях кода, где кто-то писал $Id: ...$ stuff.

Вопросы:

  • Как я могу экспортировать в Subversion, сохраняя отметки времени версий.
  • Как я могу конвертировать без расширения ключевых слов $Id: $style или, что еще лучше, удалить строки нарушения при конвертации. Возможно ли это, или мне нужно изменить историю дампа Mercurial перед преобразованием, чтобы убедиться, что нет ключевых слов?

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

Cheers, Н.

EDIT:. С тех пор я создал script, который извлекает временные метки из файла экспорта Mercurial и обновляет файл дампа Subversion, который является не чем иным, как kludge, но он работает. Проблема $Id: до сих пор остается нерешенной.

4b9b3361

Ответ 1

Это сложная проблема. Почему подход к решению по-разному:

https://bitbucket.org/durin42/hgsubversion/wiki/Home

Это расширение для Mercurial, которое позволяет вам получить к нему доступ как SVN-клиент, может ли он работать для вас?

Ответ 2

Я хочу повторно предложить hgsubversion в качестве решения. В обычном случае он используется для доступа к репозиторию Subversion с помощью hg, но вы также можете использовать его для преобразования репозитория Mercurial в Subversion, если вы не боитесь работать над своей историей изменений. (Если вы знаете, как работать с наборами изменений, у вас есть довольно немного контроля над процессом.)

По существу, вам необходимо выполнить следующие действия:

  • Сделайте свою историю Mercurial линейной (это необходимо для Subversion); вы можете использовать Свернуть расширение, чтобы свернуть любую нелинейную область истории в единый набор изменений
  • Создайте репозиторий или каталог Subversion и hg pull этот путь SVN (используя hgsubversion) в ваш репозиторий Mercurial. Для этого путь Subversion должен быть непустым, но до тех пор, пока не будет дублирования файлов в репозитории Mercurial, это должно быть хорошо.
  • Восстановите все изменения из истории Mercurial над головой истории Subversion. Это делается с помощью расширения Rebase. Если нет перекрытия, это должна быть автоматическая операция.
  • Используйте hg push, чтобы отправить результат обратно в Subversion. Линейный набор изменений, которые сходят с прежнего главы репозитория Subversion, будет добавлен в путь Subversion.

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

Ответ 3

Я попытался заменить ключевое слово один раз на SVN, и мне пришлось добавить свойство svn:keywords в рабочую папку с указанием того, какое ключевое слово (и) следует заменить. Таким образом, удаление этого свойства должно выполнять эту работу.

Эта статья о переполнении стека, возможно, связана с этим вопросом.

Ответ 4

Насколько я понимаю вашу проблему сейчас: у вас есть репозиторий Hg, который был однажды преобразован из SVN, где использовалось расширение ключевого слова. Теперь расширенные ключевые слова остаются неизменными в репо Hg. Теперь вы хотите удалить эти ключевые слова (или только их расширенные значения) из истории Hg, сохранить автора, дату/время, сообщение фиксации и, конечно, измененные файлы.

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

  • Клонировать предполагаемый исходный репозиторий
  • Подготовьте пустой репозиторий Hg
  • Выполните hg log > logfile.txt поверх исходного репо на этой ветке, которую вы хотите изменить.
  • Разберите файл, получающий структурированный список всей необходимой информации, такой как номер набора изменений, пользователь, дата и сводка, храните это в структуре данных, которая позволяет легко итеративно
  • Итерировать по списку (или напрямую использовать файл журнала) и...
    • удалить все рабочие файлы из репозитория назначения
    • экспортировать набор изменений из исходного репо в рабочую копию репозитория назначения
    • изменить что-либо в рабочих файлах, которые вы хотите сделать
    • hg addremove
    • hg commit -m ... -d ... -u ...
  • Повторите шаг 5 так часто, как необходимо

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

Если есть другие ветки, которые необходимо перенести:

  • Обновить репозиторий назначения до начальной точки перехода
  • и исходное репо тоже
  • вставьте шаги с 3 по 6 из приведенного выше списка.

Возможно, предстоит еще одна работа, но я думаю, что это может сработать. Как сказано ранее, я никогда не делал этого.