确定何时在文件或文件夹上设置属性的最简单方法是什么?基本上,我正在寻找适用于属性的等效“svn blame”。
log 子命令使人们能够获取文件或文件夹的完整历史记录,包括属性被修改的时间。但是,它不区分属性修改和其他类型的修改,这当然也意味着它不会告诉您有关特定属性的历史的任何信息。
status 命令区分属性和其他类型的修改,但仅适用于工作副本。
Blame 本身只支持文件,不支持目录,它适用于内容,而不是属性。
想法?
确定何时在文件或文件夹上设置属性的最简单方法是什么?基本上,我正在寻找适用于属性的等效“svn blame”。
log 子命令使人们能够获取文件或文件夹的完整历史记录,包括属性被修改的时间。但是,它不区分属性修改和其他类型的修改,这当然也意味着它不会告诉您有关特定属性的历史的任何信息。
status 命令区分属性和其他类型的修改,但仅适用于工作副本。
Blame 本身只支持文件,不支持目录,它适用于内容,而不是属性。
想法?
我能想到的最好的方法是编写一个小脚本或应用程序,使用 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”行可能不是第一行
#!/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
我的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
使用propget
orproplist
命令似乎真的非常慢。
For my purposes it was easy enough to do svn diff --properties-only
on every revision and store it off. It stores enough information so that you can write some other scripts to do whatever comparing/blaming that is necessary without getting into the network shenanigans or whatever made propget
/proplist
so slow.
#!/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