2009-10-27 4 views
13

Я делаю PHP-инструмент, который подключается к репозиторию, загружает список коммитов и сохраняет их локально. Однако из-за того, что некоторые репозитории являются ОГРОМНЫМИ и захватывают результаты их журнала в длительное время ожидания и возможные тайм-ауты/ошибки, я хотел бы загрузить каждое сообщение фиксации, используя асинхронные запросы.SVN: Возможно ли получить список номеров ревизий для заданного пути?

Итак, у меня есть начальную и конечную точки в истории изменений, и я могу захватить все журналы, как это:

svn log -r <from_revision>:<to_revision> <REPO_URL>

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

Если я знаю, что начало и конечную точку, я могу создать для() цикл, чтобы захватить пересмотров один за другим:

svn log -r <revision> ...

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

Итак, мне нужно что-то вроде этого:

  • «дать мне список номеров ревизий для этого пути», ИЛИ:
  • «дать мне список номеров ревизий для этого пути, и между ними

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

Все предложения приветствуются, спасибо заранее ,

+0

Вы считаете, что используете привязки SVN, а не вызываете исполняемый файл SVN CLI? IIRC, они уже существуют для PHP. Это будет гораздо более программный и менее подверженный ошибкам интерфейс. – rmeador

ответ

9

Я думаю, что лучше всего сделать следующее svn log -l 100 0:{$newest} .\, которое будет извлекать первые 100 журналов для данного каталога или файла. затем прочитайте последний номер измененной версии, затем запросите следующие 100 svn log -l 100 {$last_ret_log}:{$newest} .\

таким образом вы получите 99 новых записей журнала с каждым запросом, но вы не получите их всех.

+0

О, я должен добавить, что на первом захвате вы можете сбросить бит #: #, так как вы не знаете, что такое первая ревизия. упс. –

+0

Это звучит как хороший компромисс. Получите много журналов за итерацию, но не получите слишком много из них. BTW, 'svn log' может использоваться как' svn log 1: HEAD 'для любого пути в репозитории, но SVN будет достаточно умным, чтобы возвращать журналы между версиями 1 и HEAD, которые влияют только на пути, которые существуют в пределах запрошенный . –

+0

Полезно знать. Я обычно использую версии для всех моих задач подрывной деятельности. Однако у меня есть несколько скриптов, которые анализируют журналы svn для управления. :) –

2

Возможно, вы захотите посмотреть svn list. Так что для вашей цели:


$ svn list --verbose file:///var/svn/repos 
    16 sally   28361 Jan 16 23:18 README.txt 
    27 sally    0 Jan 18 15:27 INSTALL 
    24 harry    Jan 18 11:27 examples/ 

В этом списке последний (руководитель) пересмотр любого файла.

+0

Спасибо, но это не перечисляет все ревизии, а только последние для каждого пути. –

3

Если у вас есть доступ к дереву репозитория на сервере Subversion, вы можете использовать svnlook history, чтобы получить список номеров ревизий.

Более подробную информацию можно найти на странице http://svnbook.red-bean.com/en/1.1/re49.html.

+0

Yikes, вы почти решили проблему, но единственная проблема заключается в том, что' svnlook' не работает с URL-адресами , Это приложение будет в основном использоваться для извлечения данных удаленных репозиториев с использованием URL-адресов, а не путей :( –

+0

Спасибо! Это, возможно, решило мою проблему. Оказывает ли это те же обороты, что TortoiseSVN возвращается, когда вы нажимаете «Показать журнал по пути»? – styfle

2
svn log url -l limitNumber - r fromReversion:toReversion 

если U хочет найти следующую старшую (меньше) реверсии (версию) , например

svn log url -l 4 -r someVersion:1 
or 
    svn log url -l 4 -r 99: 3 

fromReversion больше, чем toReversion если U хочет, чтобы найти следующие новые (больше) реверсий (версия)

svn log url -l 4 -r someVersion:head 
or 
    svn log url -l 4 -r 3:99 
    fromReversion lower than toReversion 
3

Я только что пытался получить аналогичный результат. Мне просто нужны все номера ревизий для конкретной ветви.

Я нашел следующее, чтобы быть весьма полезным.

svn log <svn_server_path> | grep "^r[0-9]\+ | " | cut -d' ' -f1 | cut -c2- > revisions.csv 

Это дает мне файл со всеми номерами ревизий на отдельных строках.

Надеюсь, вам или кому-то еще будет полезно.

У нашего репо более 25000 исправлений, и для создания этого файла требуется несколько секунд.