Wie werden die Commits eines bestimmten Benutzers im SVN-Protokoll angezeigt?


162

Wie werden die Commits eines bestimmten Benutzers in svn angezeigt? Ich habe dafür keine Schalter für das SVN-Protokoll gefunden.


10
Verwenden Sie die --searchOption mit Subversion 1.8 oder einem neueren Client.
— Bahrep

Antworten:


259

Sie könnten dies verwenden:

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

Es zeigt Ihnen jedes Commit des angegebenen Benutzers (USERNAME).

AKTUALISIEREN

Wie von @bahrep vorgeschlagen, ist Subversion 1.8 mit einer --searchOption ausgestattet.


6
Diese Lösung ist perfekt. Ich würde gerne verstehen, was es tut, aber ich konnte in der sed-Dokumentation nichts finden, was es erklärt. Hat jemand irgendwelche Informationen darüber, warum das funktioniert?
— Matt Hulse

1
+1 Funktioniert auch bei mir. Wie vi ist auch Distribution unter Unix / Linux allgegenwärtiger als Python - und daher müssen Sie sich keine Gedanken über die Installation machen.
— Therobyouknow

10
@MattHulse funktioniert, weil es sed verwendet, um alles zwischen zwei angegebenen regulären Ausdrücken (dem Benutzernamen und den Bindestrichen) abzugleichen, und es dann anweist, diesen (den p) auszudrucken .
— Gijs

5
@therobyouknow Nein, Sie müssen keine svn logArbeitskopie erstellen . Sie können auch Ihr Repository angeben, d svn log https://your-svn-repo. H.
— MBober

4
Das müssen Sie nicht mehr tun. Verwenden Sie einen Client mit Subversion 1.8 oder neuer, der die --searchOption unterstützt .
— Bahrep

104

Mit Subversion 1.8 oder höher:

svn log --search johnsmith77 -l 50

Neben Autorenübereinstimmungen werden auch SVN-Commits angezeigt, die diesen Benutzernamen in der Commit-Nachricht enthalten. Dies sollte nicht passieren, wenn Ihr Benutzername kein allgemeines Wort ist.

Dadurch -l 50wird die Suche auf die letzten 50 Einträge beschränkt.

--search ARG

Filtert Protokollnachrichten, um nur diejenigen anzuzeigen, die dem Suchmuster ARG entsprechen.

Protokollnachrichten werden nur angezeigt, wenn das angegebene Suchmuster mit dem Autor, dem Datum, dem Protokollnachrichtentext (sofern nicht --quietverwendet) oder, falls die --verboseOption ebenfalls angegeben ist, einem geänderten Pfad übereinstimmt .

Wenn mehrere --searchOptionen bereitgestellt werden, wird eine Protokollmeldung angezeigt, wenn sie mit einem der bereitgestellten Suchmuster übereinstimmt.

Wenn --limites verwendet wird, wird die Anzahl der durchsuchten Protokollnachrichten eingeschränkt, anstatt die Ausgabe auf eine bestimmte Anzahl übereinstimmender Protokollnachrichten zu beschränken.

http://svnbook.red-bean.com/de/1.8/svn.ref.svn.html#svn.ref.svn.sw.search


1
@Izkata hinzugefügt in SVN 1.8: svnbook.red-bean.com/de/1.8/svn.ref.svn.c.log.html
— bahrep

Wenn Sie mehr als einen Autor suchen möchten , 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.
— Zhuguowei

Diese Lösung könnte auch mit --diff Argument verwendet werden (um geänderten Code
— anzuzeigen

Gibt es eine Möglichkeit, Erscheinungen in Festschreibungsnachrichten herauszufiltern, wenn der Benutzername ein allgemeiner (Teil) eines Wortes ist?
— Tor Klingberg

17

svn verfügt hierfür nicht über integrierte Optionen. Es gibt eine svn log --xmlOption, mit der Sie die Ausgabe selbst analysieren und die interessanten Teile abrufen können.

Sie können ein Skript schreiben, um es beispielsweise in Python 2.6 zu analysieren:

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)

Wenn Sie das oben Gesagte als svnLogStripByAuthor.py speichern, können Sie es wie folgt aufrufen:

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

Deshalb habe ich auch das 'bash'-Tag hinzugefügt.
— Mimrock

Sie könnten ein Hilfsskript schreiben, um es zu analysieren - siehe mein Beispiel
— Avi

Ich habe Python nicht installiert, aber während mein Problem auf eine nicht verwandte Weise gelöst wird, gehe ich davon aus, dass Ihre Lösung funktioniert, danke!
— Mimrock

3
Magie ist Macht. Python ist Bash.
— n611x007

13

Da sich alle zu Linux zu neigen scheinen (et al.): Hier ist das Windows-Äquivalent:

svn log [SVNPath]|find "USERNAME"

Vielen Dank! Ein Client verwendet Windows, was wirklich geholfen hat. Dies ist ein verwaltetes System, ich habe keine Administratorrechte und kann Cygwin / Perl / was auch immer nicht installieren ...
— n13

8
svn log | grep user

funktioniert zum größten Teil.

Oder genauer gesagt:

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

Vielen Dank, aber ich kann die Commit-Nachrichten nicht so sehen.
— Mimrock

@mimrock True. Sie können grep's verwenden -A, um den Kontext anzuzeigen, aber diese Zahl ist statisch, während die Festschreibungsnachricht eine variable Länge hat. Sie könnten eine Lösung mit sed oder ähnlichem finden, aber das ist Aufwand. : P
— Moinudin

Dies funktioniert auch unter Windows, wenn Sie GIT Extensions ( code.google.com/p/gitextensions ) installieren und eine GIT Bash-Eingabeaufforderung starten.
— Contango

1
@marcog Nehmen Sie der Vollständigkeit halber diese Liste der Revisionen und rufen Sie nur mit ihnen erneut an: | awk '{ print "-" $1 }' | xargs svn log
— Izkata

5

Während die Lösung von yvoyer einwandfrei funktioniert, wird hier die XML-Ausgabe von SVN verwendet und mit analysiert xmlstarlet.

svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
  --if "author = '<AUTHOR>'" \
  -v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n

Von hier aus können Sie auf erweiterte XML-Abfragen zugreifen.


3

Hier ist meine Lösung mit xslt. Leider ist xsltproc kein Streaming-Prozessor, daher müssen Sie log ein Limit geben. Anwendungsbeispiel:

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>


1

Sie können Perl verwenden, um das Protokoll nach Benutzername zu filtern und die Festschreibungsnachrichten zu verwalten. Setzen Sie einfach die Variable $ /, die entscheidet, was eine "Zeile" in Perl ausmacht. Wenn Sie dies auf das Trennzeichen der Einträge des SVN-Protokolls setzen, liest Perl jeweils einen Datensatz und Sie sollten dann in der Lage sein, den Benutzernamen im gesamten Datensatz abzugleichen. Siehe unten:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'

Dieser funktioniert auch dann, wenn Sie eine Reihe von Protokollergebnissen basierend auf einem Dateinamen finden möchten!
— Walmik

1

Unterschiede mit dem Einchecken zu bekommen.

Holen Sie sich die Revisionsnummern in eine Datei:

svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r" 

Lesen Sie nun die Datei durch und führen Sie diff für jede Revision aus:

while read p; do   svn log -v"$p" --diff ; done < Revisions.txt 

0

Ich hatte ein Skript von Python geschrieben:

#!/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

und verwenden:

$ 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

Die vorhandene Antwort, die XML verwendet und ordnungsgemäß analysiert, wird robuster und flexibler.
— Tripleee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.