SVN Список файлов, измененных исключительно 1 пользователем - PullRequest
4 голосов
/ 04 июля 2011

В нашей компании 7 разработчиков, работающих над проектом, для которого мы используем SVN в качестве VCS.

Я не уверен, возможно ли это, но есть ли способ узнать список файлов в хранилище, которые были изменены исключительно конкретным пользователем за всю историю хранилища.

Например:

  • Есть 3 пользователя - пользователь1 , пользователь2 , пользователь3
  • Также имеется 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 ]

4 голосов
/ 04 июля 2011

Хммм. Интересный вопрос.

Если вас интересуют только файлы, видимые в последней ревизии, вы можете сделать что-то вроде этого:

$ svn --recursive list 

Это даст вам список всех файлов в Subversion (по крайней мере, тех, которые в настоящее время находятся в HEAD ветвей и транков)

Оттуда вы можете передать это в команду Subversion log для каждого файла, чтобы увидеть, какие пользователи изменили этот файл за время его жизни.

$ svn -R $URL | while read file
do
     echo "FILE = $file"
     svn log $URL/$file
done

Теперь все будет немного сложнее (по крайней мере, делать это в оболочке). Вам нужно будет проанализировать вывод команды 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, но я старался изо всех сил объяснить, что я делал. Это инструмент, который я знаю, как использовать. Когда у вас есть молоток, все выглядит как гвоздь. Даже если это большой уродливый старый устаревший молоток, который у вас есть.

2 голосов
/ 04 июля 2011

По заданному имени файла вы можете узнать, сколько людей отправили в него изменения с помощью

svn log --xml filename | grep "<author>" | sort -u | wc -l

Вы можете изменить это, чтобы увидеть, был ли файл отредактирован определенным именем пользователя

svn log --xml filename | grep "<author>" | sort -u | grep username | wc -l
0 голосов
/ 04 июля 2011

Я не слишком хорошо знаю команды командной строки SVN, но я знаю, что с помощью TortoiseSVN в Windows я могу просматривать журнал, вводить свое имя в поле поиска и устанавливать диапазон дат с начала времени до настоящего времени,выберите все коммиты, которые возвращаются в поиске, а затем просмотрите все файлы, которые я все комитировали, в списке файлов.

Возможно, не слишком полезно, если вы не используете что-то вроде TortoiseSVN, но по крайней мереесли это возможно, то это должно быть возможно!

Редактировать: добавлен пример изображения, чтобы вы могли видеть, что я имею в виду

Example TortoiseSVN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...