У меня как у разработчика программного обеспечения есть большой проект, код которого хранится в репозитории Subversion®. На протяжении многих лет я много раз рефакторил код и превращал его в модульную архитектуру, состоящую из различных компонентов. Один компонент созрел до такой степени, что он действительно должен быть самостоятельным проектом сам по себе.
Я хочу, чтобы код этого компонента находился в новом автономном репозитории Subversion® (который потенциально может быть перенесен в репозиторий git
). Но я также хочу сохранить историю версий всех файлов в этом компоненте, чтобы я мог читать журнал и сообщения фиксации, которые объясняют, как и почему он оказался в его текущей форме.
Я создал дамп существующего репозитория и хочу использовать svndumpfilter
для очистки всего, кроме набора коммитов, из файла дампа, который можно импортировать в новый репозиторий (используя svnadmin load
).
В качестве предпоследнего абзаца svndumpfilter
документации сообщает, что я намерен использовать параметр include
для svndumpfilter
, чтобы перечислить пути, которые я хочу сохранить в своем новом репозитории.
Цитировать:
Возможно, в какой-то момент существования вашего репозитория вы скопировали файл или каталог из некоторого места, которое svndumpfilter исключает, в место, которое он включает. Чтобы данные дампа были самодостаточными,
svndumpfilter
все еще должен отображать добавление нового пути, включая содержимое любых файлов, созданных копией, а не представлять это добавление как копию из источника, который не будет существовать в вашем отфильтрованный поток данных дампа...... Если вы подозреваете, что у вас есть какие-либо копии такого рода в вашем репозитории, вы можете пересмотреть свой набор включенных/исключенных путей, возможно, включая также пути, которые служили источниками ваших проблемных операций копирования.
Это означает, что когда мы запускаем новый проект через фильтр, для сохранения их истории коммитов мы должны не только include
файлы проекта текущей ревизии, но и include
пути их предков.
Возникает вопрос: Как мы определяем пути этих предков?
Можно запустить команду svn log
по URL-адресу репозитория. Это вернет историю коммитов. Использование параметра --verbose
гарантирует, что мы можем видеть пути, затронутые любой данной фиксацией в этой истории.
Мы можем игнорировать случаи изменения файла. Нам действительно интересно проследить историю до того момента, когда этот файл был добавлен в репозиторий с помощью svn. Кроме того, если этот файл был добавлен с помощью команды svn-copy (или любой другой эффективной команды svn-move), мы также хотим проследить происхождение этого «исходного файла».
Вся информация содержится в выводе svn log
.
Опция --xml
печатает вывод svn log
в формате xml. Это облегчает понимание машины.
Что мне нужно, так это какой-то инструмент или метод для извлечения соответствующих данных о пути предков из потока xml, который выводится командой svn log
в данном файле репозитория.
Если это сделать для каждого файла в извлекаемом проекте, то мы можем создать набор путей, которые необходимо включить в процесс svndumpfilter
, запускаемый для фильтрации файла дампа.
Существует ли уже такой инструмент или решение?
Если это так, я был бы признателен, если бы вы могли сообщить мне об этом.
Если решения не существует, я намерен написать небольшую программу с интерфейсом командной строки (CLI) для разбора XML. См. описание проекта на github.
Я предпочитаю не «изобретать велосипед», если в этом нет необходимости, поэтому ваша помощь приветствуется.