update - svn queda en conflicto
¿Cómo se muestran las confirmaciones de un usuario específico en svn log? (11)
¿Cómo se muestran las confirmaciones de un usuario específico en svn? No encontré ningún modificador para eso para svn log.
A partir de Subversion 1.8, puede usar las svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html .
Por lo tanto, debe ser tan simple como ejecutar svn log --search JohnDoe
.
Aquí está mi solución usando xslt. Lamentablemente, sin embargo, xsltproc no es un procesador de transmisión, por lo que debe dar un límite a logaritmo. 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>------------------------------------------------------------------------
</xsl:text>
</xsl:template>
<xsl:template name="entrymatcher" match="logentry">
<xsl:text>------------------------------------------------------------------------
</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>

</xsl:text>
<xsl:if test="paths">
<xsl:text>Changed paths:
</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>
</xsl:text>
</xsl:for-each>
</xsl:if>
<xsl:text>
</xsl:text>
<xsl:value-of select="msg"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Dado que todos parecen estar inclinados hacia Linux (et al): Aquí está el equivalente de Windows:
svn log [SVNPath]|find "USERNAME"
Esto funcionó para mí (estoy usando Subversion 1.8)
svn log --search johnsmith77 -l 50
Además de las coincidencias de autor, esto también aumentará los commits de SVN que contienen ese nombre de usuario en el mensaje de confirmación, lo que no debería ocurrir si tu nombre de usuario no es una palabra común.
El -l 50
limitará la búsqueda a las últimas 50 entradas.
--search ARG
Los filtros registran mensajes 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 se use
--quiet
) o, si también se proporciona la opción--verbose
, una ruta modificada.Si se proporcionan múltiples opciones de
--search
, se muestra un mensaje de registro si coincide con cualquiera de los patrones de búsqueda proporcionados.Si se usa
--limit
, restringe la cantidad de mensajes de registro buscados, en lugar de restringir el resultado 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
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
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 establece 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/''
Puedes 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, subversion 1.8 viene con una opción --search
.
Si bien la solución de yvoyer funciona bien, aquí está una haciendo uso de la salida XML de SVN, xmlstarlet
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.
Yo escribí un script por 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
svn no viene con opciones incorporadas para esto. Tiene una opción svn log --xml
, que le permite analizar el resultado 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
svn log | grep user
funciona en su mayor parte.
O para ser más preciso:
svn log | egrep ''r[0-9]+ /| user /|''