如何在SVN中获取文件/文件夹属性的历史记录?

如何在SVN中获取文件/文件夹属性的历史记录?,svn,properties,history,Svn,Properties,History,确定文件或文件夹的属性设置时间的最简单方法是什么?基本上,我正在寻找一种类似于“svn责备”的方法,这种方法适用于属性 log子命令使用户能够获取文件或文件夹的完整历史记录,包括修改属性的时间。但是,它没有区分属性修改和其他类型的修改,这当然也意味着它不会告诉您任何关于特定属性历史的信息 status命令区分属性和其他类型的修改,但仅适用于工作副本 Bull本身只支持文件,不支持目录,它对内容有效,而不支持属性 想法?我能想到的最好方法是编写一个小脚本或应用程序,使用svn propget命令将

确定文件或文件夹的属性设置时间的最简单方法是什么?基本上,我正在寻找一种类似于“svn责备”的方法,这种方法适用于属性

log子命令使用户能够获取文件或文件夹的完整历史记录,包括修改属性的时间。但是,它没有区分属性修改和其他类型的修改,这当然也意味着它不会告诉您任何关于特定属性历史的信息

status命令区分属性和其他类型的修改,但仅适用于工作副本

Bull本身只支持文件,不支持目录,它对内容有效,而不支持属性


想法?

我能想到的最好方法是编写一个小脚本或应用程序,使用svn propget命令将当前属性值转储到文本文件,然后遍历修订,将属性转储到另一个文本文件并比较两者。一旦检测到更改,它就会打印出修订号(实际上是做出更改的较新修订号)以及提交更改的用户

下面是一个示例命令,用于在修订版80中转储字典目录的svn:ignore属性:

svn propget -r 80 svn:ignore dictionary

获取给定文件夹属性更改时间列表的一种方法是:

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”可能不是第一行

我的工具箱现在有
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

使用
propget
proplist
命令似乎非常非常慢

就我的目的而言,在每个修订版上执行
svn diff--properties only
,并将其存储起来非常简单。它存储了足够的信息,因此您可以编写其他脚本来执行任何必要的比较/指责,而无需进入网络骗局或任何使
propget
/
proplist
如此缓慢的操作

#!/bin/bash

# 7273 being the highest revision in my repository
for j in {1..7273}; do
    i=$((j-1))
    echo "$i:$j"
    svn diff --properties-only -r $i:$j https://... > propdiff.$j.txt
done

我将以缺乏更好的选择作为答案,即没有现成的方法来做到这一点。啊,好吧。这件事最重要的是,进行修改的人不一定是改变财产的人。我不明白,@anonfunc,其他人怎么能改变财产?我认为包含新属性值的第一个修订版始终是提交更改的修订版。我运行svn propset svn:eol样式的“LF”文件。这修改了r80的属性,但保留了同一作者Bob。然后r81被Alice干掉了。“我的属性更改从未得到自己的修订,我的名字也从未进入对话。你真的尝试过吗,@anonfunc?”?在SVN1.5中,它在我的工作副本中将文件标记为已修改,我必须用新版本提交更改。您是否混淆了未版本化的修订属性,如
svn:author
svn:date
,以及版本化的文件和目录属性,如
svn:eol style
?在中有版本化和未版本化属性的描述。最佳答案是,很久以前就对此进行了升级。很难相信Subversion没有提供过滤日志中此类细节的原生方法。
#!/bin/bash

# 7273 being the highest revision in my repository
for j in {1..7273}; do
    i=$((j-1))
    echo "$i:$j"
    svn diff --properties-only -r $i:$j https://... > propdiff.$j.txt
done