Respuestas:
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 --search
opción.
p
).
svn log
una copia de trabajo. También puede especificar su repositorio, es decir svn log https://your-svn-repo
.
--search
opción.
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 50
limitará 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
--quiet
se use) o, si la--verbose
opción también se proporciona, una ruta modificada.Si
--search
se proporcionan varias opciones, se muestra un mensaje de registro si coincide con alguno de los patrones de búsqueda proporcionados.Si
--limit
se 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
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.
svn no viene con opciones integradas para esto. Tiene una svn log --xml
opció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
Dado que todos parecen estar inclinándose hacia Linux (et al): Aquí está el equivalente de Windows:
svn log [SVNPath]|find "USERNAME"
svn log | grep user
funciona en su mayor parte.
O para ser más exactos:
svn log | egrep 'r[0-9]+ \| user \|'
-A
para 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
| awk '{ print "-" $1 }' | xargs svn log
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.
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>------------------------------------------------------------------------
</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>
Comenzando con Subversion 1.8, puede utilizar --search
y --search-and
las opciones de línea de comandos con el svn log
comando .
Por lo tanto, debería ser tan simple como correr svn log --search JohnDoe
.
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/'
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
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
--search
opción con Subversion 1.8 o un cliente más nuevo.