SVN文件列表由1个用户专门更改

时间:2011-07-04 14:23:32

标签: svn version-control

我们公司有7名开发人员正在开发一个项目,我们使用SVN作为VCS。

我不确定这是否可行,但有没有办法找出存储库中的文件列表,这些文件在整个存储库历史记录中由特定用户专门更改。

例如:

  • 有3位用户 - user1 user2 user3
  • 此外,还有3个文件 - “folder1 / file1”“folder1 / file2”“folder2 / file1”

存储库有10个提交 -

  • “folder1 / file1”仅由 user1 进行更改。
  • “folder1 / file2”已更改 user2 user3
  • “folder2 / file1”已更改 user1 user2 user3

基本上,在上述情况下,如果搜索由 user1 专门更改的文件,则结果将为“folder1 / file1”,因为其他文件的更改来自多位作者

我尝试了Google和SO搜索,但找不到任何解决方案。如果有办法实现这一点,将会非常感激。

此致

3 个答案:

答案 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这样的东西,可能没有太大的帮助,但至少如果能做到这一点那么它一定是可能的!

编辑:添加了示例图片,以便您可以看到我的意思

Example TortoiseSVN