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.

Mimrock
quelle
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.

yvoyer
quelle
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

Michael Butler
quelle
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
Avi
quelle
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"
user2197169
quelle
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 \|'
Moinudin
quelle
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.

mxgr
quelle
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>
Yonran
quelle
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/'
Stathis Sideris
quelle
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 
user668958
quelle
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
Ruikye
quelle
Die vorhandene Antwort, die XML verwendet und ordnungsgemäß analysiert, wird robuster und flexibler.
Tripleee