Comment afficher les commits d'un utilisateur spécifique dans svn? Je n'ai trouvé aucun commutateur pour cela pour svn log.
Vous pouvez utiliser ceci:
svn log | sed -n '/USERNAME/,/-----$/ p'
Il vous montrera chaque commit effectué par l'utilisateur spécifié (USERNAME).
[~ # ~] met à jour [~ # ~]
Comme suggéré par @bahrep, Subversion 1.8 est livré avec un --search
option.
Avec Subversion 1.8 ou version ultérieure:
svn log --search johnsmith77 -l 50
En plus des correspondances d'auteur, cela activera également les commits SVN contenant ce nom d'utilisateur dans le message de validation, ce qui ne devrait pas arriver si votre nom d'utilisateur n'est pas un mot commun.
Le -l 50
limitera la recherche aux 50 dernières entrées.
--search ARG
Filtre les messages de journalisation pour afficher uniquement ceux qui correspondent au modèle de recherche ARG.
Les messages de journal ne sont affichés que si le modèle de recherche fourni correspond à l’auteur, à la date et au texte du message de journal (sauf si
--quiet
est utilisé) ou, si le--verbose
L'option est également fournie, un chemin modifié.Si plusieurs
--search
_ options sont fournies, un message de journalisation s'affiche s'il correspond à l'un des modèles de recherche fournis.Si
--limit
est utilisé, il limite le nombre de messages de journal recherchés, plutôt que de limiter la sortie à un nombre particulier de messages de journal correspondants.
http://svnbook.red-bean.com/fr/1.8/svn.ref.svn.html#svn.ref.svn.sw.search
svn ne vient pas avec des options intégrées pour cela. Il y a un svn log --xml
option, pour vous permettre d’analyser vous-même la sortie et d’obtenir les parties intéressantes.
Vous pouvez écrire un script pour l’analyser, par exemple, dans 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 vous sauvegardez ce qui précède sous le nom svnLogStripByAuthor.py, vous pouvez l’appeler ainsi:
svn log --xml other-options | svnLogStripByAuthor.py user
Puisque tout le monde semble pencher vers linux (et al): Voici l'équivalent Windows:
svn log [SVNPath]|find "USERNAME"
svn log | grep user
fonctionne pour la plupart.
Ou pour être plus précis:
svn log | egrep 'r[0-9]+ \| user \|'
Bien que la solution de yvoyer fonctionne bien, en voici une qui utilise la sortie XML de SVN en l’analysant avec xmlstarlet
.
svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
--if "author = '<AUTHOR>'" \
-v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n
À partir de là, vous pouvez entrer dans des requêtes XML plus avancées.
Voici ma solution utilisant xslt. Malheureusement, xsltproc n’est pas un processeur de streaming, vous devez donc limiter le journal. Exemple d'utilisation:
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>
Depuis Subversion 1.8, vous pouvez utiliser --search
et --search-and
options de ligne de commande avec svn log
commande .
Donc, cela devrait être aussi simple que de courir svn log --search JohnDoe
.
Pour obtenir des diffs avec l'enregistrement.
Obtenez les numéros de révision dans un fichier:
svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r"
Maintenant, lisez le fichier et exécutez diff pour chaque révision:
while read p; do svn log -v"$p" --diff ; done < Revisions.txt
Vous pouvez utiliser Perl pour filtrer le journal par nom d'utilisateur et gérer les messages de validation. Il suffit de définir la variable $/qui détermine ce qui constitue une "ligne" en Perl. Si vous définissez ceci sur le séparateur des entrées du journal SVN, Perl lira un enregistrement à la fois et vous pourrez alors faire correspondre le nom d'utilisateur dans tout l'enregistrement. Voir ci-dessous:
svn log | Perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
J'avais écrit 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
et utilise:
$ 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