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

Как вы получаете историю свойств файла/папки в SVN?

Какой самый простой способ определить, когда свойство было задано в файле или папке? В принципе, я ищу эквивалент "svn вины", который работает с свойствами.

Подкоманда журнала позволяет получить полную историю файла или папки, в том числе при изменении свойств. Тем не менее, он не проводит различия между модификацией свойств и другими типами модификаций, что, конечно же, также означает, что он ничего не расскажет об истории конкретного свойства.

Команда status различает свойства и другие типы модификаций, но работает только с рабочей копией.

Вина, сама по себе, поддерживает только файлы, а не каталоги, и она работает с контентом, а не с его свойствами.

Идеи?

4b9b3361

Ответ 1

Лучшее, что я могу придумать, - написать небольшое script или приложение, которое использует команду svn propget, чтобы сбрасывать текущее значение свойства в текстовый файл, а затем возвращается обратно к версиям, сбрасывая свойство в другой текстовый файл и сравнение этих двух. Как только он обнаруживает изменение, он печатает номер версии (фактически более поздний номер версии, внесший изменение) вместе с пользователем, который его совершил.

Здесь приведен пример команды для сброса свойства svn: ignore для каталога словаря в редакции 80:

svn propget -r 80 svn:ignore dictionary

Ответ 2

Один из способов получить список свойств свойств для данной папки:

svn log -v . |grep "   M /trunk/datacenter$" -B2

Что дает следующий вывод:

r963 | someuser | 2013-08-26 20:32:37 +0200 (Mon, 26 Aug 2013) | 4 lines
Changed paths:
   M /trunk/datacenter
--
r908 | someotheruser | 2013-08-15 12:15:03 +0200 (Thu, 15 Aug 2013) | 1 line
Changed paths:
   M /trunk/datacenter
--
r413 | someuser | 2013-04-26 09:02:08 +0200 (Fri, 26 Apr 2013) | 1 line
Changed paths:
   M /trunk/datacenter

Затем вы можете посмотреть каждую ревизию, чтобы увидеть, что изменилось:

$ svn diff -c963

внизу:

...

Property changes on: .
___________________________________________________________________
Modified: svn:ignore
## -22,3 +22,5 ##

 .idea
 .classpath
+
+dev-config.groovy

Минусы:

  • Невозможно указать, какое свойство вам интересно.
  • Утомительная

Примечание: не уверен -B2 достаточно во всех случаях, так как строка "M/trunk/datacenter" может не быть первой строкой

Ответ 3

#!/bin/bash
# This is not a great solution, but it works for gathering the data

CURRENT_REVISION=95300
OLDEST_REVISION=93000
URL="file:///home/svn/repo/project/dir/target.c"
PROPERTY_NAME="svn:externals"

for i in `seq $OLDEST_REVISION $CURRENT_REVISION`
do
  svn -r$i propget "$PROPERTY_NAME" "$URL" | sed -e "s/^/$i\t/"
done

Ответ 4

В моем svn-extensions теперь есть команды svn-prop-annotate и (как специализация) svn-mergeinfo-annotate. Они работают плохо (потому что они запускают svn log и svn diff для каждого потенциального изменения), и могут по-прежнему иметь некоторые зависимости и особенности для моего конкретного стиля работы, но попробуйте их, если вы в отчаянии.

Вот пример вывода:

$ svn-mergeinfo-annotate --author karkat -l 5
67645 ingo.karka    Merged /branches/1.50/foobar:r67488
67423 ingo.karka    Merged /branches/1.50/foobar:r67315,67331
67339 ingo.karka    Merged /branches/1.50/foobar:r67279
53320 ingo.karka    Merged /branches/foo-1.01:r53317