Svn लॉग में एक विशिष्ट उपयोगकर्ता के कमिट कैसे प्रदर्शित करें?


161

कैसे एक विशिष्ट उपयोगकर्ता के svn में प्रदर्शित करता है? मुझे svn लॉग के लिए कोई स्विच नहीं मिला।


10
--searchतोड़फोड़ 1.8 या नए ग्राहक के साथ विकल्प का उपयोग करें ।
बहरूपे

जवाबों:


258

आप इसका उपयोग कर सकते हैं:

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

यह आपको निर्दिष्ट उपयोगकर्ता (USERNAME) द्वारा की गई प्रत्येक प्रतिबद्धता दिखाएगा।

अपडेट करें

जैसा कि @bahrep द्वारा सुझाया गया है, तोड़फोड़ 1.8 एक --searchविकल्प के साथ आता है ।


6
यह समाधान एकदम सही है। मैं यह समझना चाहूंगा कि यह क्या कर रहा है, लेकिन मुझे इसके बारे में बताने वाले sed प्रलेखन में कुछ भी नहीं मिल पाया है। किसी को भी यह क्यों काम करता है के बारे में कोई जानकारी है?
मैट हल्स

1
+1 मेरे लिए भी काम करता है। Vi की तरह, यूनिक्स / लिनक्स डिस्ट्रोस सेड पर पायथन की तुलना में शायद अधिक सर्वव्यापी है - और इसलिए स्थापना के बारे में चिंता करने की आवश्यकता नहीं है।
थेरोब्युकन जूल

10
@MattHulse यह काम करता है क्योंकि यह दो निर्दिष्ट नियमित अभिव्यक्तियों (उपयोगकर्ता नाम और डैश) के बीच सब कुछ मिलान करने के लिए sed का उपयोग करता है, और फिर इसे प्रिंट करने के लिए कहता है कि ( p)।
गिज़्स

5
@therobyouknow नहीं, आपको svn logकार्यशील प्रतिलिपि पर प्रदर्शन करने की आवश्यकता नहीं है। आप अपनी रिपॉजिटरी भी निर्दिष्ट कर सकते हैं, अर्थात svn log https://your-svn-repo
MBober

4
अब ऐसा करने की जरूरत नहीं है। Subversion 1.8 या नए क्लाइंट का उपयोग करें जो --searchविकल्प का समर्थन करता है।
बहरूपे

101

तोड़फोड़ के साथ 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


1
@Izkata ने SVN 1.8 में जोड़ा: svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
bahrep

यदि आप एक से अधिक लेखक खोज करना चाहते हैं, svn log --search foo --search bar -l 30If multiple --search options are provided, a log message is shown if it matches any of the provided search patterns.
ज़ुगुवेई

इस समाधान का उपयोग -डिफ़ तर्क के साथ भी किया जा सकता है (परिवर्तित कोड दिखाने के लिए)
जोरो

यदि उपयोगकर्ता नाम एक शब्द का सामान्य (भाग) है, तो प्रतिबद्ध संदेशों में दिखावे को फ़िल्टर करने का कोई तरीका?
टोर क्लिंगबर्ग

17

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

इसलिए मैंने 'बैश' टैग भी जोड़ा।
नकल करें

आप इसे पार्स करने के लिए एक यूटिलिटी स्क्रिप्ट लिख सकते हैं - मेरा उदाहरण देखें
Avi

मेरे पास अजगर स्थापित नहीं है, लेकिन जब मेरी समस्या असंबंधित तरीके से हल हो गई है, तो मुझे लगता है कि आपका समाधान काम कर रहा है, धन्यवाद!
14

3
जादू हो सकता है। पायथन बैश है।
n611x007

13

चूंकि हर कोई लिनक्स (एट अल) की ओर झुक रहा है: यहां विंडोज समतुल्य है:

svn log [SVNPath]|find "USERNAME"

धन्यवाद! एक ग्राहक विंडोज का उपयोग कर रहा है ताकि वास्तव में मदद मिले। यह एक प्रबंधित प्रणाली है, मेरे पास व्यवस्थापक अधिकार नहीं हैं और मैं cygwin / perl / जो भी स्थापित कर सकता
हूं

8
svn log | grep user

अधिकांश भाग के लिए काम करता है।

या अधिक सटीक होने के लिए:

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

धन्यवाद, लेकिन मैं इस तरह से प्रतिबद्ध संदेश नहीं देख सकता।
13

@ मिमरॉक ट्रू आप -Aसंदर्भ प्रदर्शित करने के लिए grep कर सकते हैं , लेकिन यह संख्या स्थिर है जबकि प्रतिबद्ध संदेश चर लंबाई का है। आप सेड या समान के साथ एक समाधान बना सकते हैं, लेकिन यह प्रयास है। : पी
मोइनुद्दीन

यह Windows के अंतर्गत भी काम करता है, यदि आप GIT एक्सटेंशन ( code.google.com/p/gitextensions ) स्थापित करते हैं और GIT BIT कमांड प्रॉम्प्ट शुरू करते हैं।
कंटैंगो

1
@marcog सच्ची पूर्णता के लिए, संशोधन की सूची लें और उनके साथ एक और कॉल करें:| awk '{ print "-" $1 }' | xargs svn log
इज़काता

5

जबकि 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 प्रश्नों में जा सकते हैं।


3

यहाँ 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>------------------------------------------------------------------------&#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

आप उपयोगकर्ता नाम से लॉग को फ़िल्टर करने और प्रतिबद्ध संदेशों को बनाए रखने के लिए पर्ल का उपयोग कर सकते हैं । बस $ / चर सेट करें जो यह तय करता है कि पर्ल में एक "लाइन" क्या है। यदि आप इसे SVN लॉग की प्रविष्टियों के विभाजक पर सेट करते हैं, तो पर्ल एक बार में एक रिकॉर्ड पढ़ेगा और फिर आपको पूरे रिकॉर्ड में उपयोगकर्ता नाम से मेल खाने में सक्षम होना चाहिए। निचे देखो:

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

यह तब भी काम करता है, जब आप फ़ाइल नाम के आधार पर लॉग परिणाम का एक गुच्छा ढूंढना चाहते हैं!
वाल्मिक

1

GET चेकइन के साथ अलग हो जाता है।

एक फ़ाइल में संशोधन संख्या प्राप्त करें:

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

अब फ़ाइल के माध्यम से पढ़ें और प्रत्येक पुनरीक्षण के लिए निष्पादन अलग है:

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

0

मैंने पायथन द्वारा एक स्क्रिप्ट लिखी थी:

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

मौजूदा उत्तर जो XML का उपयोग करता है और ठीक से पार्स करता है वह अधिक मजबूत और लचीला होने जा रहा है।
ट्रिपल ट्रिपल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.