web-dev-qa-db-fra.com

Comment afficher les commits d'un utilisateur spécifique dans svn log?

Comment afficher les commits d'un utilisateur spécifique dans svn? Je n'ai trouvé aucun commutateur pour cela pour svn log.

157
mimrock

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.

254
yvoyer

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

95
Michael Butler

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
17
Avi

Puisque tout le monde semble pencher vers linux (et al): Voici l'équivalent Windows:

svn log [SVNPath]|find "USERNAME"
13
user2197169
svn log | grep user

fonctionne pour la plupart.

Ou pour être plus précis:

svn log | egrep 'r[0-9]+ \| user \|'
8
marcog

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.

5
mxgr

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>------------------------------------------------------------------------&#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>
3
yonran

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.

3
bahrep

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 
1
user668958

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/'
1
Stathis Sideris

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
0
ruikye