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

时间:2009-08-04 23:16:04

标签: svn properties history

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

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

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

Blame本身只支持文件,而不支持目录,它适用于内容,而不是属性。

想法?

5 个答案:

答案 0 :(得分:8)

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

这是在版本80转储字典目录的svn:ignore属性的示例命令:

svn propget -r 80 svn:ignore dictionary

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

#!/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

答案 3 :(得分:0)

我的svn-extensions工具箱现在有svn-prop-annotate和(作为专业化)svn-mergeinfo-annotate命令。它们表现不佳(因为它们针对每个潜在的变化运行svn logsvn 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

答案 4 :(得分:0)

使用propgetproplist命令似乎真的非常慢。

出于我的目的,在每个修订版本上进行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