¿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.


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.


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



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

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"

¡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 \|'

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.


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>


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/'

¡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 

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

La respuesta existente que usa XML y la analiza correctamente será más robusta y flexible.
tripleee
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.