Как вы получаете историю свойства файла / папки в SVN? - PullRequest
19 голосов
/ 05 августа 2009

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

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

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

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

Идеи

Ответы [ 4 ]

8 голосов
/ 05 августа 2009

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

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

svn propget -r 80 svn:ignore dictionary
7 голосов
/ 26 августа 2013

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

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" может быть не первой строкой

1 голос
/ 22 марта 2012
#!/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
0 голосов
/ 04 ноября 2016

Мои 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
...