我们公司有7名开发人员正在开发一个项目,我们使用SVN作为VCS。
我不确定这是否可行,但有没有办法找出存储库中的文件列表,这些文件在整个存储库历史记录中由特定用户专门更改。
例如:
存储库有10个提交 -
基本上,在上述情况下,如果搜索由 user1 专门更改的文件,则结果将为“folder1 / file1”,因为其他文件的更改来自多位作者
我尝试了Google和SO搜索,但找不到任何解决方案。如果有办法实现这一点,将会非常感激。
此致
答案 0 :(得分:4)
嗯。有趣的问题。
如果您只对最新版本中显示的文件感兴趣,可以执行以下操作:
$ svn --recursive list
这将为您提供Subversion中所有文件的列表(至少是目前在分支和主干的HEAD中的文件)
从那里,您可以将其传输到每个文件的Subversion log
命令中,以查看哪些用户在该文件的生命周期内修改了该文件。
$ svn -R $URL | while read file
do
echo "FILE = $file"
svn log $URL/$file
done
现在,事情会变得有点棘手(至少在shell中这样做)。您必须解析svn log
命令的输出,这意味着您再次从STDIN读取。为了解决这个问题,你必须为该输出打开另一个设备号,然后从那里读取...
好的,让我们在Perl中做到这一点......
# Bunch of Pragmas that don't mean much
use strict;
use warnings;
use feature qw(say);
# Defining some constants for svn command and url
use constant {
URL => "svn://localhost",
SVN => "svn",
};
my $cmd;
# This creates the svn list command to list all files
# I'm opening this command as if it's a file
$cmd = SVN . " list -R " . URL;
open (FILE_LIST, "$cmd|")
or die "Can't open command '$cmd' for reading\n";
# Looping through the output of the "svn list -R URL"
# and setting "$file" to the name of the file
while (my $file = <FILE_LIST>) {
chomp $file;
# Now opening the "svn log URL/$file" command as a file
$cmd = SVN . " log " . URL . "/$file";
open(FILE_LOG, "$cmd|")
or die "Can't open command '$cmd' for reading\n";
my $initialChanger = undef;
my $changer;
# Looping through the output of the "svn log" command
while (my $log = <FILE_LOG>) {
chomp $log;
# Skipping all lines that don't start with a revision number.
# I don't care about the commit log, I want the name of the
# user who is in the next section over between two pipes
next unless ($log =~ /^\s*r\d+\s+\|\s*([^|]+)/);
# The previous RegEx actually caught the name of the changer
# in the parentheses, and now just setting the changer
$changer = $1;
# If there is no initialChanger, I set the changer to be initial
$initialChanger = $changer if (not defined $initialChanger);
# And if the changer isn't the same as the initial, I know at least
# two people edited this file. Get the next file
if ($initialChanger ne $changer)
{
close FILE_LOG;
next;
}
}
# Finished with file log, if we're down here, there was only
# one person who edited the file.
close FILE_LOG;
say qq(Sole Changer of "$file" is "$changer");
}
快速而肮脏且未经过充分测试。我在我的存储库上测试了它,但后来我是我的存储库中的唯一更换器。我知道你没有要求Perl,但我尽力解释我在做什么。这是我知道如何使用的工具。当你拿锤子时,一切看起来像钉子。即使那是一件你曾经拥有的丑陋的旧丑陋锤子。
答案 1 :(得分:2)
根据文件名,您可以通过
找出有多少人提交了更改svn log --xml filename | grep "<author>" | sort -u | wc -l
您可以对其进行修改,以查看该文件是否已由特定用户名
进行编辑svn log --xml filename | grep "<author>" | sort -u | grep username | wc -l
答案 2 :(得分:0)
我不太了解SVN命令行命令,但我知道在Windows上使用TortoiseSVN我可以查看日志,在搜索框中推送我的名字并设置从开始到现在的日期范围,选择在搜索中返回的所有提交,然后查看我在文件列表中提交的所有文件。
如果你不使用像TortoiseSVN这样的东西,可能没有太大的帮助,但至少如果能做到这一点那么它一定是可能的!
编辑:添加了示例图片,以便您可以看到我的意思