¿Cómo mostrar los commits de un usuario específico en svn log?

161

¿Cómo mostrar los commits de un usuario específico en svn? No encontré ningún interruptor para eso para svn log.

mimrock
fuente
10
Use la --searchopción con Subversion 1.8 o un cliente más nuevo.
bahrep

Respuestas:

258

Podrías usar esto:

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

Le mostrará cada confirmación realizada por el usuario especificado (NOMBRE DE USUARIO).

ACTUALIZAR

Como lo sugiere @bahrep, la subversión 1.8 viene con una --searchopción.

yvoyer
fuente
66
Esta solución es perfecta. Me gustaría entender qué está haciendo, pero no he podido encontrar nada en la documentación de sed que lo explique. ¿Alguien tiene alguna información sobre por qué esto funciona?
Matt Hulse
1
+1 también funciona para mí. Al igual que vi, en las distribuciones de Unix / Linux es quizás más omnipresente que Python, y por lo tanto no hay que preocuparse por la instalación.
therobyouknow
10
@MattHulse funciona porque usa sed para unir todo entre dos expresiones regulares especificadas (el nombre de usuario y los guiones), y luego le dice que imprima eso (el p).
Gijs
55
@therobyouknow No, no necesita realizar svn loguna copia de trabajo. También puede especificar su repositorio, es decir svn log https://your-svn-repo.
MBober
44
No hay necesidad de hacer esto más. Utilice Subversion 1.8 o un cliente más nuevo que admita la --searchopción.
bahrep
101

Con Subversion 1.8 o posterior:

svn log --search johnsmith77 -l 50

Además de las coincidencias de autor, esto también generará confirmaciones SVN que contienen ese nombre de usuario en el mensaje de confirmación, lo que no debería suceder si su nombre de usuario no es una palabra común.

El -l 50limitará la búsqueda en las últimas 50 entradas.

--search ARG

Filtra los mensajes de registro para mostrar solo aquellos que coinciden con el patrón de búsqueda ARG.

Los mensajes de registro se muestran solo si el patrón de búsqueda proporcionado coincide con el autor, la fecha, el texto del mensaje de registro (a menos que --quietse use) o, si la --verboseopción también se proporciona, una ruta modificada.

Si --searchse proporcionan varias opciones, se muestra un mensaje de registro si coincide con alguno de los patrones de búsqueda proporcionados.

Si --limitse usa, restringe el número de mensajes de registro buscados, en lugar de restringir la salida a un número particular de mensajes de registro coincidentes.

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

Michael Butler
fuente
1
@Izkata agregado en SVN 1.8: svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
bahrep
si desea buscar más de un autor 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
Esta solución podría usarse con el argumento --diff también (para mostrar el código modificado)
joro
¿Alguna forma de filtrar las apariencias en los mensajes de confirmación, si el nombre de usuario es una palabra común (parte de)?
Tor Klingberg
17

svn no viene con opciones integradas para esto. Tiene una svn log --xmlopción, que le permite analizar la salida usted mismo y obtener las partes interesantes.

Puede escribir un script para analizarlo, por ejemplo, en 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)

Si guarda lo anterior como svnLogStripByAuthor.py, puede llamarlo como:

svn log --xml other-options | svnLogStripByAuthor.py user
Avi
fuente
Es por eso que también agregué la etiqueta 'bash'.
mimrock
Podría escribir un script de utilidad para analizarlo - vea mi ejemplo
Avi
No tengo instalado Python, pero aunque mi problema se resuelve de una manera no relacionada, supongo que su solución está funcionando, ¡gracias!
mimrock
3
La mágia es poder. Python es Bash.
n611x007
13

Dado que todos parecen estar inclinándose hacia Linux (et al): Aquí está el equivalente de Windows:

svn log [SVNPath]|find "USERNAME"
usuario2197169
fuente
¡Gracias! Un cliente está utilizando Windows, por lo que realmente ayudó. Este es un sistema administrado, no tengo derechos de administrador y no puedo instalar cygwin / perl / lo que sea ...
n13
8
svn log | grep user

funciona en su mayor parte.

O para ser más exactos:

svn log | egrep 'r[0-9]+ \| user \|'
moinudin
fuente
Gracias, pero no puedo ver los mensajes de confirmación de esa manera.
mimrock
@mimrock Verdadero. Podría grep's -Apara mostrar el contexto, pero este número es estático, mientras que el mensaje de confirmación es de longitud variable. Podría hacer una solución con sed o similar, pero eso es esfuerzo. : P
moinudin
Esto también funciona en Windows, si instala GIT Extensions ( code.google.com/p/gitextensions ) e inicia un símbolo del sistema GIT Bash.
Contango
1
@marcog Para una verdadera integridad, tome esa lista de revisiones y haga otra llamada solo con ellas: | awk '{ print "-" $1 }' | xargs svn log
Izkata
5

Si bien la solución de yvoyer funciona bien, aquí hay una que utiliza la salida XML de SVN, analizándola con xmlstarlet.

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

Desde aquí, puede acceder a consultas XML más avanzadas.

mxgr
fuente
3

Aquí está mi solución usando xslt. Sin embargo, desafortunadamente, xsltproc no es un procesador de transmisión, por lo que debe limitar el registro. Ejemplo de uso:

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>
yonran
fuente
1

Puede usar Perl para filtrar el registro por nombre de usuario y mantener los mensajes de confirmación. Simplemente configure la variable $ / que decide qué constituye una "línea" en Perl. Si configura esto en el separador de las entradas del registro SVN, Perl leerá un registro a la vez y luego podrá hacer coincidir el nombre de usuario en todo el registro. Vea abajo:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
Stathis Sideris
fuente
¡Esto funciona incluso si desea encontrar un montón de resultados de registro basados ​​en un nombre de archivo!
walmik
1

Para obtener diferencias junto con el registro.

Obtenga los números de revisión en un archivo:

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

Ahora lea el archivo y ejecute diff para cada revisión:

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

Había escrito un script de Python:

#!/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

y use:

$ 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
ruikye
fuente
La respuesta existente que usa XML y la analiza correctamente será más robusta y flexible.
tripleee