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.

Vous pourriez utiliser ceci:

 svn log | sed -n '/USERNAME/,/-----$/ p' 

Il vous montrera chaque validation effectuée par l’utilisateur spécifié (USERNAME).

METTRE À JOUR

Comme suggéré par @bahrep, subversion 1.8 est fourni avec une option --search .

Avec Subversion 1.8 ou version ultérieure:

 svn log --search johnsmith77 -l 50 

Outre les correspondances entre auteurs, cela activera également les commits SVN contenant ce nom d’utilisateur dans le message de validation, ce qui ne devrait pas se produire si votre nom d’utilisateur n’est pas un mot courant.

Le -l 50 limitera la recherche aux 50 dernières entrées.

--search ARG

Les filtres enregistrent les messages pour afficher uniquement ceux qui correspondent au modèle de recherche ARG.

Les messages de journal ne s’affichent que si le modèle de recherche fourni correspond à l’un des auteurs, dates, messages (sauf si --quiet est utilisé) ou, si l’option --verbose est également fournie, à un chemin modifié.

Si plusieurs options de recherche sont fournies, un message de journal 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/en/1.8/svn.ref.svn.html#svn.ref.svn.sw.search

svn ne vient pas avec des options intégrées pour cela. Il possède une option svn log --xml pour vous permettre d’parsingr vous-même le résultat et d’obtenir les parties intéressantes.

Vous pouvez écrire un script pour l’parsingr, 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 logensortinges = (elem for event, elem in iparse if event == 'end' and elem.tag == 'logentry') for logentry in logensortinges: if logentry.find('author').text == author: dump(logentry) logNode.remove(logentry) 

Si vous enregistrez ce qui précède comme svnLogSsortingpByAuthor.py, vous pouvez l’appeler comme:

 svn log --xml other-options | svnLogSsortingpByAuthor.py user 

Puisque tout le monde semble pencher vers linux (et al): Voici l’équivalent de 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 \|' 

Alors que la solution de yvoyer fonctionne correctement, 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 = ''" \ -v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n 

De là, vous pouvez accéder à des requêtes XML plus avancées.

Voici ma solution en utilisant xslt. Malheureusement, xsltproc n’est pas un processeur de streaming, vous devez donc indiquer une limite pour le journal. Exemple d’utilisation:

 svn log -v --xml --limit=500 | xsltproc --ssortingngparam author yonran /path/to/svnLogFilter.xslt - | xsltproc /path/to/svnLogText.xslt - | less 

svnLogFilter.xslt

                             

svnLogText.xslt

        ------------------------------------------------------------------------
   ------------------------------------------------------------------------
 r  |    |   

  Changed paths:
        
   
  
   

À partir de Subversion 1.8, vous pouvez utiliser les --search et --search-and -line avec svn log commande svn log .

Donc, il devrait être aussi simple que d’exécuter svn log --search JohnDoe .

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écide de 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/' 

Pour GET diffs avec le checkin.

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 

J’avais écrit un script par 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