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.