Wie werden die Commits eines bestimmten Benutzers in svn angezeigt? Ich habe dafür keine Schalter für das SVN-Protokoll gefunden.
svn
bash
version-control
Mimrock
quelle
quelle
--search
Option mit Subversion 1.8 oder einem neueren Client.Antworten:
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
--search
Option ausgestattet.quelle
p
) auszudrucken .svn log
Arbeitskopie erstellen . Sie können auch Ihr Repository angeben, dsvn log https://your-svn-repo
. H.--search
Option unterstützt .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 50
wird die Suche auf die letzten 50 Einträge beschränkt.http://svnbook.red-bean.com/de/1.8/svn.ref.svn.html#svn.ref.svn.sw.search
quelle
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.
svn verfügt hierfür nicht über integrierte Optionen. Es gibt eine
svn log --xml
Option, 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
quelle
Da sich alle zu Linux zu neigen scheinen (et al.): Hier ist das Windows-Äquivalent:
svn log [SVNPath]|find "USERNAME"
quelle
svn log | grep user
funktioniert zum größten Teil.
Oder genauer gesagt:
svn log | egrep 'r[0-9]+ \| user \|'
quelle
-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| awk '{ print "-" $1 }' | xargs svn log
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.
quelle
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>------------------------------------------------------------------------
</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>
quelle
Beginnend mit Subversion 1.8 können Sie verwenden
--search
und--search-and
Befehlszeilenoptionen mitsvn log
Befehl .Es sollte also so einfach wie das Laufen sein
svn log --search JohnDoe
.quelle
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/'
quelle
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
quelle
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
quelle