Как вы получаете историю свойств файла/папки в SVN?
Какой самый простой способ определить, когда свойство было задано в файле или папке? В принципе, я ищу эквивалент "svn вины", который работает с свойствами.
Подкоманда журнала позволяет получить полную историю файла или папки, в том числе при изменении свойств. Тем не менее, он не проводит различия между модификацией свойств и другими типами модификаций, что, конечно же, также означает, что он ничего не расскажет об истории конкретного свойства.
Команда status различает свойства и другие типы модификаций, но работает только с рабочей копией.
Вина, сама по себе, поддерживает только файлы, а не каталоги, и она работает с контентом, а не с его свойствами.
Идеи?
Ответы
Ответ 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