जवाबों:
आप इसका उपयोग कर सकते हैं:
svn log | sed -n '/USERNAME/,/-----$/ p'
यह आपको निर्दिष्ट उपयोगकर्ता (USERNAME) द्वारा की गई प्रत्येक प्रतिबद्धता दिखाएगा।
अपडेट करें
जैसा कि @bahrep द्वारा सुझाया गया है, तोड़फोड़ 1.8 एक --search
विकल्प के साथ आता है ।
p
)।
svn log
कार्यशील प्रतिलिपि पर प्रदर्शन करने की आवश्यकता नहीं है। आप अपनी रिपॉजिटरी भी निर्दिष्ट कर सकते हैं, अर्थात svn log https://your-svn-repo
।
--search
विकल्प का समर्थन करता है।
तोड़फोड़ के साथ 1.8 या बाद में:
svn log --search johnsmith77 -l 50
लेखक मैचों के अलावा, यह एसवीएन उन कमिटों को भी बंद कर देगा, जिनमें उस संदेश में उपयोगकर्ता नाम शामिल है, जो कि आपके उपयोगकर्ता नाम के सामान्य शब्द नहीं होने पर नहीं होना चाहिए।
-l 50
नवीनतम 50 प्रविष्टियों के लिए खोज सीमित कर देगा।
--search ARG
फ़िल्टर केवल संदेश दिखाने के लिए लॉग लॉग करते हैं जो खोज पैटर्न ARG से मेल खाते हैं।
लॉग संदेश केवल तभी प्रदर्शित किए जाते हैं जब प्रदान किए गए खोज पैटर्न लेखक, तिथि, लॉग संदेश पाठ (जब तक
--quiet
कि उपयोग नहीं किया जाता है) या यदि--verbose
विकल्प भी प्रदान किया जाता है, तो एक परिवर्तित पथ से मेल खाता है।यदि कई
--search
विकल्प प्रदान किए जाते हैं, तो लॉग संदेश दिखाया जाता है यदि यह किसी भी खोज पैटर्न से मेल खाता है।यदि
--limit
इसका उपयोग किया जाता है, तो यह लॉग संदेश की विशेष संख्या में आउटपुट को सीमित करने के बजाय, खोज किए गए लॉग संदेशों की संख्या को प्रतिबंधित करता है।
http://svnbook.red-bean.com/en/1.8/svn.ref.svn.html#svn.ref.svn.sw.search
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 इसके लिए अंतर्निहित विकल्पों के साथ नहीं आता है। यह एक svn log --xml
विकल्प है, जिससे आप आउटपुट को स्वयं पार्स कर सकते हैं, और दिलचस्प भागों को प्राप्त कर सकते हैं।
आप इसे पार्स करने के लिए एक स्क्रिप्ट लिख सकते हैं, उदाहरण के लिए, पायथन 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)
यदि आप उपरोक्त को svnLogStripByAuthor.py के रूप में सहेजते हैं, तो आप इसे इस रूप में कह सकते हैं:
svn log --xml other-options | svnLogStripByAuthor.py user
चूंकि हर कोई लिनक्स (एट अल) की ओर झुक रहा है: यहां विंडोज समतुल्य है:
svn log [SVNPath]|find "USERNAME"
svn log | grep user
अधिकांश भाग के लिए काम करता है।
या अधिक सटीक होने के लिए:
svn log | egrep 'r[0-9]+ \| user \|'
-A
संदर्भ प्रदर्शित करने के लिए grep कर सकते हैं , लेकिन यह संख्या स्थिर है जबकि प्रतिबद्ध संदेश चर लंबाई का है। आप सेड या समान के साथ एक समाधान बना सकते हैं, लेकिन यह प्रयास है। : पी
| awk '{ print "-" $1 }' | xargs svn log
जबकि yvoyer का समाधान ठीक काम करता है, यहाँ SVN के XML आउटपुट का उपयोग किया जा रहा है, इसके साथ पार्सिंग xmlstarlet
।
svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
--if "author = '<AUTHOR>'" \
-v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n
यहाँ से आप अधिक उन्नत XML प्रश्नों में जा सकते हैं।
यहाँ xslt का उपयोग करके मेरा समाधान है। दुर्भाग्य से, हालांकि, xsltproc एक स्ट्रीमिंग प्रोसेसर नहीं है, इसलिए आपको लॉग को एक सीमा देनी होगी। उदाहरण उपयोग:
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>
सबवर्सन 1.8 की शुरुआत के साथ, आप उपयोग कर सकते हैं --search
और --search-and
साथ कमांड लाइन विकल्प svn log
कमांड ।
तो यह चलाने के रूप में सरल होना चाहिए svn log --search JohnDoe
।
आप उपयोगकर्ता नाम से लॉग को फ़िल्टर करने और प्रतिबद्ध संदेशों को बनाए रखने के लिए पर्ल का उपयोग कर सकते हैं । बस $ / चर सेट करें जो यह तय करता है कि पर्ल में एक "लाइन" क्या है। यदि आप इसे SVN लॉग की प्रविष्टियों के विभाजक पर सेट करते हैं, तो पर्ल एक बार में एक रिकॉर्ड पढ़ेगा और फिर आपको पूरे रिकॉर्ड में उपयोगकर्ता नाम से मेल खाने में सक्षम होना चाहिए। निचे देखो:
svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
GET चेकइन के साथ अलग हो जाता है।
एक फ़ाइल में संशोधन संख्या प्राप्त करें:
svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r"
अब फ़ाइल के माध्यम से पढ़ें और प्रत्येक पुनरीक्षण के लिए निष्पादन अलग है:
while read p; do svn log -v"$p" --diff ; done < Revisions.txt
मैंने पायथन द्वारा एक स्क्रिप्ट लिखी थी:
#!/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
और उपयोग करें:
$ 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
--search
तोड़फोड़ 1.8 या नए ग्राहक के साथ विकल्प का उपयोग करें ।