svn log에 특정 사용자의 커밋을 표시하는 방법은 무엇입니까?


161

svn에서 특정 사용자의 커밋을 표시하는 방법은 무엇입니까? svn log에 대한 스위치를 찾지 못했습니다.


10
--searchSubversion 1.8 이상의 클라이언트에서 옵션을 사용하십시오 .
— bahrep

답변:


258

이것을 사용할 수 있습니다 :

svn log | sed -n '/USERNAME/,/-----$/ p' 

지정된 사용자 (USERNAME)의 모든 커밋을 보여줍니다.

최신 정보

@bahrep이 제안한 것처럼 subversion 1.8 에는 --search옵션 이 제공됩니다 .


6
이 솔루션은 완벽합니다. 나는 그것이하는 일을 이해하고 싶지만 sed documentation에서 그것을 설명하는 것을 찾을 수 없었습니다. 왜 이것이 작동하는지에 대한 정보가 있습니까?
— Matt Hulse

1
+1 저에게도 효과가 있습니다. vi와 마찬가지로 유닉스 / 리눅스 배포판에서 sed는 아마도 파이썬보다 더 편재 할 수 있으므로 설치에 대해 걱정할 필요가 없습니다.
— therobyouknow

10
@MattHulse는 sed를 사용하여 지정된 두 정규 표현식 (사용자 이름과 대시) 사이의 모든 항목을 일치시킨 다음 인쇄하도록 지시합니다 ( p).
— Gijs

5
@therobyouknow 아니오, svn log작업 사본 을 수행 할 필요는 없습니다 . 저장소를 지정할 수도 있습니다 (예 :) svn log https://your-svn-repo.
— MBober

4
더 이상 할 필요가 없습니다. --search옵션 을 지원하는 Subversion 1.8 이상 클라이언트를 사용하십시오 .
— bahrep

101

Subversion 1.8 이상에서 :

svn log --search johnsmith77 -l 50

저자 일치 외에도 커밋 메시지에 해당 사용자 이름이 포함 된 SVN 커밋이 나타나며 사용자 이름이 일반적인 단어가 아닌 경우에는 발생하지 않아야합니다.

는 -l 50최근 50 개 항목에 대한 검색을 제한합니다.

--search ARG

검색 패턴 ARG와 일치하는 메시지 만 표시하도록 로그 메시지를 필터링합니다.

제공된 검색 패턴이 작성자, 날짜, 로그 메시지 텍스트 ( --quiet사용 되지 않은 경우 ) 또는 --verbose옵션이 제공되는 경우 변경된 경로 와 일치하는 경우에만 로그 메시지가 표시됩니다 .

여러 --search옵션이 제공되는 경우 제공된 검색 패턴과 일치하면 로그 메시지가 표시됩니다.

경우에 --limit사용되며, 이는 로그 메시지의 개수는 오히려 로그 메시지를 일치하는 특정 수의 출력을 제한하기보다는, 검색 제한한다.

http://svnbook.red-bean.com/en/1.8/svn.ref.svn.html#svn.ref.svn.sw.search


1
@Izkata는 SVN 1.8에 추가되었습니다 : svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
— bahrep

둘 이상의 저자를 검색하려면 svn log --search foo --search bar -l 30. If multiple --search options are provided, a log message is shown if it matches any of the provided search patterns.
— zhuguowei

이 솔루션은 --diff 인수와 함께 사용할 수도 있습니다 (변경된 코드 표시)
— joro

사용자 이름이 일반적인 단어의 일부인 경우 커밋 메시지에서 표현을 필터링하는 방법은 무엇입니까?
— Tor Klingberg

17

svn에는이를위한 내장 옵션이 제공되지 않습니다. 그것은 있는가 svn log --xml하면 출력을 직접 분석 할 수 있도록, 옵션을, 그리고 흥미로운 부분을 얻을.

예를 들어 Python 2.6에서 스크립트를 구문 분석하는 스크립트를 작성할 수 있습니다.

import sys
from xml.etree.ElementTree import iterparse, dump

author = sys.argv[1]
iparse = iterparse(sys.stdin, ['start', 'end'])

for event, elem in iparse:
    if event == 'start' and elem.tag == 'log':
        logNode = elem
        break

logentries = (elem for event, elem in iparse
                   if event == 'end' and elem.tag == 'logentry')

for logentry in logentries:
    if logentry.find('author').text == author:
        dump(logentry)
    logNode.remove(logentry)

위의 내용을 svnLogStripByAuthor.py로 저장하면 다음과 같이 호출 할 수 있습니다.

svn log --xml other-options | svnLogStripByAuthor.py user

그래서 'bash'태그도 추가했습니다.
— mimrock

구문 분석을 위해 유틸리티 스크립트를 작성할 수 있습니다. – 예를 참조하십시오
— Avi

파이썬이 설치되어 있지 않지만 문제가 관련이없는 방식으로 해결되는 동안 솔루션이 작동한다고 가정합니다. 감사합니다!
— mimrock

3
마법이 맞을 수도 있습니다. 파이썬은 배쉬입니다.
— n611x007

13

모든 사람들이 리눅스 (et al)에 대해 기울고있는 것 같습니다.

svn log [SVNPath]|find "USERNAME"

감사! 클라이언트가 Windows를 사용하고 있으므로 실제로 도움이되었습니다. 이것은 관리 시스템이며 관리자 권한이 없으며 cygwin / perl /
— what을

8
svn log | grep user

대부분의 경우 작동합니다.

또는 더 정확하려면 :

svn log | egrep 'r[0-9]+ \| user \|'

고맙지 만 커밋 메시지를 볼 수 없습니다.
— mimrock

@mimrock True. grep을 사용 -A하여 컨텍스트를 표시 할 수 있지만이 숫자는 정적이지만 커밋 메시지의 길이는 가변적입니다. sed 또는 이와 유사한 솔루션을 만들 수는 있지만 노력입니다. : P
— moinudin

GIT 확장 프로그램 ( code.google.com/p/gitextensions ) 을 설치 하고 GIT Bash 명령 프롬프트를 시작 하면 Windows에서도 작동 합니다.
— Contango

1
@marcog 진정한 완성도를 유지하려면 해당 개정 목록을 가져 와서 다음과 같이 다시 전화하십시오. | awk '{ print "-" $1 }' | xargs svn log
— Izkata

5

yvoyer의 솔루션은 잘 작동하지만 SVN의 XML 출력을 사용하여 구문 분석하는 것이 있습니다 xmlstarlet.

svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
  --if "author = '<AUTHOR>'" \
  -v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n

여기에서보다 고급 XML 쿼리로 이동할 수 있습니다.


3

xslt를 사용하는 솔루션은 다음과 같습니다. 불행히도 xsltproc은 스트리밍 프로세서가 아니므로 로그에 제한을 두어야합니다. 사용법 예 :

svn log -v --xml --limit=500  | xsltproc --stringparam author yonran /path/to/svnLogFilter.xslt  - | xsltproc /path/to/svnLogText.xslt  - | less

svnLogFilter.xslt

<!--
svnLogFilter.xslt

Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml | xsltproc -stringparam author yonran svnLogFilter.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="author" select="''"/>
  <xsl:strip-space elements="log"/>
  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
  <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
  <xsl:variable name="lowercaseAuthor" select="translate($author, $uppercase, $lowercase)"/>

<xsl:template match="/log">
  <xsl:copy>
    <xsl:apply-templates name="entrymatcher"/>
  </xsl:copy>
</xsl:template>

<xsl:template name="entrymatcher" match="logentry">
  <xsl:variable name="lowercaseChangeAuthor" select="translate(author, $uppercase, $lowercase)"/>
  <xsl:choose>
    <xsl:when test="contains($lowercaseChangeAuthor, $lowercaseAuthor)">
      <xsl:call-template name="insideentry"/>
    </xsl:when>
    <!--Filter out-->
    <xsl:otherwise/>
  </xsl:choose>
</xsl:template>


<xsl:template name="insideentry" match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

svnLogText.xslt

<!--
svnLogText.xslt

Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml -limit=1000 | xsltproc svnLogText.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="author" select="''"/>
  <xsl:param name="xml" select="false()"/>
  <xsl:output method="text"/>

<xsl:template match="/log">
  <xsl:apply-templates name="entrymatcher"/>
  <xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
</xsl:template>

<xsl:template name="entrymatcher" match="logentry">
  <xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
  <xsl:text>r</xsl:text><xsl:value-of select="@revision"/>
  <xsl:text> | </xsl:text>
  <xsl:value-of select="author"/>
  <xsl:text> | </xsl:text>
  <xsl:value-of select="date"/>
  <xsl:text>&#xa;&#xa;</xsl:text>
  <xsl:if test="paths">
    <xsl:text>Changed paths:&#xa;</xsl:text>
    <xsl:for-each select="paths/path">
      <xsl:text>   </xsl:text>
      <xsl:value-of select="@action"/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="."/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:if>
  <xsl:text>&#xa;</xsl:text>
  <xsl:value-of select="msg"/>
  <xsl:text>&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>


1

당신은 사용자 이름으로 로그를 필터링하기 위해 펄을 사용 하고 커밋 메시지를 유지한다. Perl에서 "라인"을 구성하는 것을 결정하는 $ / 변수를 설정하십시오. 이것을 SVN 로그 항목의 구분 기호로 설정하면 Perl은 한 번에 하나의 레코드를 읽고 전체 레코드의 사용자 이름을 일치시킬 수 있습니다. 아래를보십시오 :

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'

이것은 파일 이름을 기반으로 많은 로그 결과를 찾으려고하더라도 작동합니다!
— walmik

1

체크인과 함께 차이를 가져옵니다.

수정 번호를 파일로 가져옵니다.

svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r" 

이제 파일을 읽고 각 개정에 대해 diff를 실행하십시오.

while read p; do   svn log -v"$p" --diff ; done < Revisions.txt 

0

파이썬으로 스크립트를 작성했습니다.

#!/usr/bin/python
# coding:utf-8

import sys

argv_len = len(sys.argv)


def help():
    print 'Filter svnlog by user or date!       '
    print 'USEAGE: svnlog [ARGs]                '
    print 'ARGs:                                '
    print '    -n[=name]:                       '
    print '      filter by the special [=name]\n'
    print '    -t[=date]:                       '
    print '      filter by the special [=date]  '
    print 'EXP:                                 '
    print '1. Filter ruikye\'s commit log       \n'
    print '     svn log -l 50 | svnlog -n=ruikye\n'


if not argv_len - 1:
    help()
    quit()

author = ''
date = ''

for index in range(1, argv_len):
    argv = sys.argv[index]
    if argv.startswith('-n='):
        author = argv.replace('-n=', '')
    elif argv.startswith('-t='):
        date = argv.replace('-t=', '')
    else:
        help()
        quit()

if author == '' and date == '':
    help()
    quit()


SPLIT_LINE =
    '------------------------------------------------------------------------'
src = ''.join(sys.stdin.readlines()).replace('\n\n', '\n')
lines = src.split(SPLIT_LINE)

for line in lines:
    if author in line and date in line:
        print SPLIT_LINE, line

if len(lines):
    print SPLIT_LINE

그리고 사용 :

$ mv svnlog.py svnlog          

$ chmod a+x svnlog             

$ cd /usr/local/bin
$ ln -s ~/mycmd/svnlog filter 

$ svn log | filter -n=ruikye -t=2015-03-04

XML을 사용하고 올바르게 구문 분석하는 기존 답변은보다 강력하고 유연합니다.
— Tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.