Как преобразовать неструктурированные папки SVN в стиль магистрали / ветвей и сохранить историю? - PullRequest
4 голосов
/ 10 апреля 2010

У меня есть SVN-репозиторий, который в настоящее время структурирован так:

/versions
  /1.0.0
  /1.0.1
  /1.0.2
  /1.1.0
  /(etc)

То, что здесь произошло, состояло в том, что, когда пришло время начинать новый выпуск, член команды делал копию папки предыдущей версии и переименовывал эту папку; затем добавьте / передайте эту новую папку в SVN.

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

Итак, я хотел бы преобразовать эту серию папок в традиционную структуру SVN trunk / branch / tag.

Можно ли как-то "согласовать" истории ревизий каждой из этих версионных папок обратно в одно общее дерево истории ревизий?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2010

Просто чтобы уточнить: когда вы говорите, что они будут добавлять / фиксировать, вы имеете в виду, что они не делали svn-копию старой версии с именем новой версии, правильно? Исходя из предположения, что я правильно понял ...

Возможно ли это? Да, но не на месте и не легко.

Для этого я бы написал сценарий, который по сути воспроизводил бы коммиты так, как вы этого хотите, создавал дамп нового репозитория в svn-дамп-файл, настраивал дамп-файл с помощью svndumptool.py и, возможно, немного настраивал. сценарии для установки дат и авторов и тому подобное.

Вы можете получить svn, чтобы помочь вам. Попробуйте этот подход:

Сделайте копию своего репозитория , чтобы вы могли работать с этим и не создавать беспорядок для других. Затем в этом хранилище создайте каталоги /project /project/trunk, /project/tags и /project/branches. Оформить заказ на проект / багажник. Используйте svn export, чтобы получить версию 1 вашей версии 1.0.0 в вашу рабочую копию. Захватите исходное сообщение о фиксации, используя svn log --xml, используйте svn add, чтобы добавить все файлы, и подтвердите. Это дает вам исходную отправную точку.

Теперь, для каждого коммита, сделанного в /version/1.0.0, объедините этот набор изменений с вашим новым транком, извлеките сообщение о коммите, используя svn log --xml, и подтвердите. Как только вы исчерпаете коммиты до 1.0.0, выполните svn copy с trunk до tags/1.0.0. Затем используйте svn merge --ignore-ancestry .../version/1.0.0 .../version/1.0.1@xyz (где xyz - первый коммит версии 1.0.1). Это должно дать вам любые изменения, которые произошли как часть вашего процесса выпуска. (Возможно, вам придется немного поэкспериментировать, чтобы сделать это правильно.)

Повторите этот процесс для каждой из оставшихся версий.

Как только вы закончите с этим, у вас будет хранилище с лучшей историей под /project, но все еще будет старая уродливая история под /versions. Чтобы убрать это, используйте svn dump project, чтобы создать дамп-файл, содержащий только новую историю. Теперь вам придется немного поработать над сценариями и, возможно, свободно использовать svndumptool.py для исправления временных отметок и авторов фиксации в файле дампа, извлекая эту информацию из вывода svn log --xml. Возможно, вам придется «придумать» эту информацию для коммитов, которые вы сделали.

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

(О, и вы получите бонусные баллы, если вы установите отметку времени коммита вашей первоначальной svn mkdir /project /project/trunk /project/tags /project/branches равной 1984 .;))

Раскрытие информации: я внес вклад в svndumptool.py

3 голосов
/ 10 апреля 2010

Я был в такой ситуации, и я не думаю, что то, что вы хотите сделать, возможно без какой-либо тяжелой работы за пределами SVN. Если вам ДЕЙСТВИТЕЛЬНО не нужна линейная история ваших старых выпусков, IMO наиболее практичным способом будет просто переместить эти версионные папки в каталог tags (или, возможно, branches) и убедиться, что выпуски помечены правильно сейчас на. По крайней мере, у вас есть история изменений с начала каждого выпуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...