2011-07-04 2 views
4

저희 회사에는 SVN을 VCS로 사용하는 프로젝트에 참여한 7 명의 개발자가 있습니다.SVN 1 명의 사용자가 독점적으로 변경 한 파일 목록

이것이 가능한지 확실하지 않지만 저장소의 내역 전체에서 특정 사용자가 독점적으로 변경 한 저장소의 파일 목록을 찾는 방법이 있습니다.

예를 들어

: - USER1, 사용자 2, 또한 사용자 3

  • , 3 개 파일이 - "폴더 1/FILE1", "폴더 1

    • 3 사용자 있습니다/file2 " 및 "folder2/file1 "
    단지 사용자 1에 의해이 변경되었습니다

    • "폴더 1/FILE1"-210

      저장소는 10 커밋이있다.

    • "폴더 1/파일 2"사용자 2사용자 3로 변경되었습니다.
    • "Folder2와/FILE1"는 USER1 의해 변경 USER2 사용자 3있다. 파일을 검색하는 사용자 1에 의해 독점적으로 변경 한 경우 다른 파일이 여러 저자의 변경이 있기 때문에

    기본적으로 위의 경우, 결과는, "폴더 1/FILE1" 될 것입니다.

    Google과 SO 검색을 시도했지만 이에 대한 해결책을 찾을 수 없습니다. 이것을 성취 할 수있는 방법이 있다면 정말 감사 할 것입니다.

    감사

  • 답변

    4

    흠. 재미있는 질문. 최신 버전에서 볼 파일에만 관심이 있다면

    , 당신이 뭔가를 할 수 있습니다 :

    $ svn --recursive list 
    

    는 그 (당신에게 적어도 사람 서브 버전에있는 모든 파일의 목록을 줄 것이다 현재 지점과 트렁크의 HEAD에 있음)

    거기에서 각 파일에 대한 Subversion log 명령으로이 파일을 파이프하여 해당 파일의 수명 시간에 해당 파일을 수정 한 사용자를 확인할 수 있습니다.

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

    이제 약간의 문제가 발생합니다 (최소한 쉘에서는이를 수행함). svn log 명령의 출력을 구문 분석해야합니다. 즉, STDIN에서 다시 읽는 것입니다. 그 해결하기 위해서는, 해당 출력을 위해 다른 장치 번호를 열고있는 동안 그에서 읽을해야 할 것이다 ...

    좋아, 펄에서이 작업을 수행 할 수 ...

    # 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을 요구하지 않았다는 것을 알고 있지만, 최선을 다해 제가 한 일을 설명하려고 노력했습니다. 그것은 사용법을 알고있는 도구입니다. 망치가 있으면 모든 것이 못처럼 보입니다. 그것이 오래된 추악한 오래된 망치 일지라도 당신은 가지고있는 일이 있습니다.

    +0

    내가 이것을 시도해 보자. Perl 사용은 문제가되지 않습니다. –

    +0

    감사합니다. 이것은 완벽하게 작동했습니다. 방금 파일 목록을 얻기 위해 출력 텍스트를 변경했습니다. 내가 원했던 것. –

    0

    나는 SVN 명령 줄이 너무 잘 명령 모르겠지만, Windows에서 TortoiseSVN이를 사용하는 나는, 로그를 보려면 검색 창에 내 이름을 밀어 수 있다는 것을 알고와에서 날짜 범위를 설정하는 이제부터는 검색으로 되돌아온 모든 커밋을 선택한 다음 파일 목록에있는 모든 파일을 볼 수 있습니다.

    TortoiseSVN과 같은 것을 사용하지 않는다면 아마 그렇게 도움이되지는 않겠지 만 적어도 가능하다면 가능할 것입니다!

    편집 : 당신은 내가

    Example TortoiseSVN

    +0

    답변 해 주셔서 감사합니다. 나는 이것을 이전에 시도했지만이 목록에는 다른 사용자로부터 커밋 된 파일도 포함됩니다. 특정 사용자가 독점적으로 변경 한 파일 목록을 원합니다. 다른 사용자가 해당 파일을 수정해서는 안됩니다. –

    +0

    나는 7 명의 사용자 각각에 대해 이러한 목록 중 하나를 얻고, Excel 또는 데이터베이스에 저장하고, 한 명 목록에있는 파일에 대해 해당 데이터를 쿼리/필터링 할 수 있다고 생각하는 더러운 방법을 추측합니다 다른 사람들의 이상적이지는 않습니다. 특히 돌아가서 이것을 반복해서보고 싶다면. – Treborbob

    +0

    모든 파일 목록, user1이 변경 한 파일 목록 및 user1을 제외한 모든 사용자가 변경 한 파일 목록 간의 diff를 수행하여 동일한 작업을 수행 할 수 있습니다. 자동화가 될 수 있다고 생각합니다. 그것을 시도하고 여기에서 대답 할 것입니다. –

    1

    당신이

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

    당신은 할 수와 변경 사항을 제출 얼마나 많은 사람들이 찾을 수있는 파일 이름을 감안할 때 무슨 뜻인지 볼 수 있도록 예제 이미지를 추가 파일을 수정하여 특정 사용자 이름으로 파일이 수정되었는지 확인하십시오.

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

    여러 사용자가 편집 한 파일이 포함되므로이 방법은 작동하지 않습니다. –

    +0

    @A - 각 명령의 * sort -u *는 고유 작성자의 수를 제공합니다. 첫 번째 명령은 고유 한 작성자 수를 제공하고 두 번째 명령은 특정 사용자 이름으로 편집되었는지 여부를 나타냅니다. 필자는 필요한 사용자가 파일을 고유하게 편집했는지 여부를 두 사람이 함께 알려주는 것으로 충분하다고 생각했습니다. – borrible

    관련 문제