Проанализируйте вывод `svn log`, чтобы перечислить только пути предыдущих воплощений истории определенного файла.

У меня как у разработчика программного обеспечения есть большой проект, код которого хранится в репозитории 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.

Я предпочитаю не «изобретать велосипед», если в этом нет необходимости, поэтому ваша помощь приветствуется.


person JW.    schedule 11.07.2015    source источник
comment
Недавно у меня было подобное требование, и единственное, что я смог найти, это subdi.vision/extract, но я не проверял это, потому что дорого. Хотя может еще кому поможет.   -  person ravisorg    schedule 28.04.2016
comment
Спасибо @ravisorg. Функция subdi.vision/extract — это именно то, что я искал. Я думаю, что у меня более 2000 ревизий, поэтому также придется платить за расширенную версию. Я мог бы поиграть с бесплатной версией, чтобы проверить это. Если да, то я отчитаюсь.   -  person JW.    schedule 28.04.2016


Ответы (1)


  1. Я не знаю такого инструмента в дикой сети (я полагаю, что каждый «изобретает велосипед», используя свои любимые инструменты)
  2. Я думаю, вы можете обрабатывать и не-XML (менее зашумленный) вывод svn log FILENAME

Некоторые образцы с (немного модифицированным) игрушечным репо в состоянии HEAD

>svn ls -R
API/
API/intefaces.txt
Core/
Core/core-classic.txt
Modules/
Modules/modules-classic.txt

с такой короткой историей

>svn log -v -q
------------------------------------------------------------------------
r5 | Badger | 2015-07-12 20:58:23 +0500 (Вс, 12 июл 2015)
Changed paths:
   A /trunk/API/intefaces.txt (from /trunk/inteface.txt:4)
   A /trunk/Core/core-classic.txt (from /trunk/core.txt:4)
   A /trunk/Modules/modules-classic.txt (from /trunk/modules.txt:4)
   D /trunk/core.txt
   D /trunk/inteface.txt
   D /trunk/modules.txt
------------------------------------------------------------------------
r4 | Badger | 2015-07-12 20:55:29 +0500 (Вс, 12 июл 2015)
Changed paths:
   A /trunk/API
   A /trunk/Core
   A /trunk/Modules
------------------------------------------------------------------------
r3 | Badger | 2015-07-12 20:53:36 +0500 (Вс, 12 июл 2015)
Changed paths:
   D /trunk/a.txt
   D /trunk/b.txt
   D /trunk/c.txt
   A /trunk/core.txt (from /trunk/a.txt:2)
   A /trunk/inteface.txt (from /trunk/c.txt:2)
   A /trunk/modules.txt (from /trunk/b.txt:2)
------------------------------------------------------------------------
r2 | Badger | 2015-07-12 20:50:40 +0500 (Вс, 12 июл 2015)
Changed paths:
   A /trunk/a.txt
   A /trunk/b.txt
   A /trunk/c.txt
------------------------------------------------------------------------
r1 | Badger | 2015-07-12 20:47:11 +0500 (Вс, 12 июл 2015)
Changed paths:
   A /branches
   A /tags
   A /trunk
------------------------------------------------------------------------

В случае восстановления истории, т.е. Core каталог для XML и не-XML журналов, которые вам нужно выполнить примерно одинаковое количество операций

>svn log Core -q -v | grep A | grep Core | grep from
   A /trunk/Core/core-classic.txt (from /trunk/core.txt:4)

(повторяйте для каждой PATH-части со стороны "от" рекурсивно)

или, для XML-журнала (обрезана нерелевантная часть лога)

>svn log Core -q -v --xml
...
<paths>
...
<path
   text-mods="false"
   kind="file"
   copyfrom-path="/trunk/core.txt"
   copyfrom-rev="4"
   action="A"
   prop-mods="false">/trunk/Core/core-classic.txt</path>
...

(проанализируйте каждый узел пути на наличие интересного пути, извлеките исходный путь из ключа copyfrom-path, повторите регистрацию с новым извлеченным путем)

person Lazy Badger    schedule 12.07.2015
comment
Спасибо. Это очень полезная информация. - person JW.; 12.07.2015