কীভাবে কোনও নির্দিষ্ট ব্যবহারকারীর কমিটগুলি এসএনএন লগে প্রদর্শিত হবে?


161

কিভাবে একটি নির্দিষ্ট ব্যবহারকারীর কমিটগুলি এসএনএন-তে প্রদর্শিত হবে? এসএনএন লগের জন্য আমি কোনও স্যুইচ খুঁজে পাইনি।


10
--searchসাবভারশন 1.8 বা আরও নতুন ক্লায়েন্টের সাথে বিকল্পটি ব্যবহার করুন ।
বহরেপ

উত্তর:


258

আপনি এটি ব্যবহার করতে পারেন:

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

এটি আপনাকে নির্দিষ্ট ব্যবহারকারীর দ্বারা তৈরি প্রতিটি প্রতিশ্রুতি প্রদর্শন করবে (USERNAME)।

হালনাগাদ

@ বাহারেপ দ্বারা প্রস্তাবিত হিসাবে, সাবভারশন 1.8 একটি --searchবিকল্পের সাথে আসে ।


6
এই সমাধান নিখুঁত। আমি এটি কী করছে তা বুঝতে চাই তবে সেড ডকুমেন্টেশনে এটি ব্যাখ্যা করে এমন কোনও কিছুই আমি খুঁজে পাচ্ছি না। এটি কেন কাজ করে সে সম্পর্কে কারও কাছে কোনও তথ্য আছে?
ম্যাট হুলসে

1
+1 আমার পক্ষেও কাজ করে। Vi এর মতো ইউনিক্স / লিনাক্সে ডিস্ট্রোস সেড পাইথনের চেয়ে সম্ভবত সর্বব্যাপী - এবং তাই ইনস্টলেশন সম্পর্কে চিন্তা করার দরকার নেই।
থেরোবিউকেন

10
@ ম্যাটহুলস এটি কাজ করে কারণ এটি দুটি নির্দিষ্ট নিয়মিত এক্সপ্রেশন (ব্যবহারকারীর নাম এবং ড্যাশগুলি) এর মধ্যে সমস্ত কিছু মেলে সেড ব্যবহার করে এবং তারপরে এটি (এটি p) মুদ্রণ করতে বলে ।
গিজ

5
@ অন্যরকম জ্ঞান না, আপনাকে svn logএকটি কাজের অনুলিপি সম্পাদন করার দরকার নেই । আপনি আপনার সংগ্রহস্থলও নির্দিষ্ট করতে পারেন svn log https://your-svn-repo
এমবিবর

4
এটি আর করার দরকার নেই। সাবভারশন 1.8 বা নতুন ক্লায়েন্ট ব্যবহার করুন যা --searchবিকল্পটিকে সমর্থন করে ।
বহরেপ

101

সাব্ভারশনটি 1.8 বা তার পরে:

svn log --search johnsmith77 -l 50

লেখকের মিলগুলি ছাড়াও, এটি প্রতিবেদক বার্তায় সেই ব্যবহারকারীর নাম থাকা এসভিএন কমিটসও সক্রিয় করবে, যা আপনার ব্যবহারকারীর নাম সাধারণ শব্দ না হলে ঘটবে না n't

-l 50সর্বশেষ 50 টি এন্ট্রির মধ্যে অনুসন্ধান সীমিত হবে।

--search ARG

অনুসন্ধান প্যাটার্ন এআরজির সাথে মেলে এমনগুলি দেখাতে লগ বার্তাগুলি ফিল্টার করে।

প্রদত্ত অনুসন্ধানের প্যাটার্নটি কোনও লেখকের, তারিখ, লগ বার্তা পাঠ্যের (যদি --quietব্যবহার না করা হয়) সাথে মেলে বা --verboseবিকল্পটি সরবরাহ করা হয় তবে পরিবর্তিত পথটি কেবল লগ বার্তাগুলি প্রদর্শিত হয়।

যদি একাধিক --searchবিকল্প সরবরাহ করা থাকে তবে কোনও সরবরাহিত অনুসন্ধানের নিদর্শনগুলির সাথে এটি মেলে যদি একটি লগ বার্তা প্রদর্শিত হয়।

যদি --limitএটি ব্যবহার করা হয় তবে এটি নির্দিষ্ট সংখ্যক মিলের লগ বার্তাগুলিতে আউটপুটকে সীমাবদ্ধ না রেখে অনুসন্ধান করা লগ বার্তাগুলির সংখ্যাকে সীমাবদ্ধ করে।

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


1
@ ইজকাটা এসভিএন ১.৮-এ যুক্ত হয়েছে: এসএনএনবুক.ড- বিয়েন.ইন
বাহরেপ

আপনি যদি একাধিক লেখক অনুসন্ধান করতে চান 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

এই সমাধানটিও - ডিফ আর্গুমেন্টের সাথে ব্যবহার করা যেতে পারে (পরিবর্তিত কোড দেখানোর জন্য)
জোড়ো

প্রতিশ্রুতিবদ্ধ বার্তাগুলিতে উপস্থিতিগুলি ফিল্টার করার কোনও উপায়, যদি ব্যবহারকারীর নামটি একটি সাধারণ (অংশ) থাকে?
টোর ক্লিংবার্গ

17

এসএনএন এর জন্য অন্তর্নির্মিত বিকল্পগুলি নিয়ে আসে না। svn log --xmlআপনাকে আউটপুটটি নিজেরাই পার্স করতে এবং আকর্ষণীয় অংশগুলি পেতে অনুমতি দেওয়ার জন্য এটির একটি বিকল্প রয়েছে।

এটি বিশ্লেষণের জন্য আপনি কোনও স্ক্রিপ্ট লিখতে পারেন, উদাহরণস্বরূপ, পাইথন ২.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

এজন্য আমি 'বাশ' ট্যাগও যুক্ত করেছি।
মিম্রোক

আপনি এটি বিশ্লেষণের জন্য কোনও ইউটিলিটি স্ক্রিপ্ট লিখতে পারেন - আমার উদাহরণটি দেখুন
অ্যাভি

আমার কাছে পাইথন ইনস্টল করা নেই, তবে আমার সমস্যাটি কোনও সম্পর্কহীনভাবে সমাধান করার সময়, আমি ধরে নিই যে আপনার সমাধানটি কাজ করছে, আপনাকে ধন্যবাদ!
মিম্রোক

3
জাদুই শক্তি. পাইথন বাশ।
n611x007

13

যেহেতু সকলেই লিনাক্স (এট আল) এর দিকে ঝুঁকছেন বলে মনে হচ্ছে: উইন্ডোজ সমতুল্য:

svn log [SVNPath]|find "USERNAME"

ধন্যবাদ! একটি ক্লায়েন্ট উইন্ডোজ ব্যবহার করছে যাতে সত্যই সহায়তা করে। এটি একটি পরিচালিত সিস্টেম, আমার প্রশাসকের অধিকার নেই এবং সাইগউইন / পার্ল / যা কিছু ইনস্টল করতে পারি না ...
n13

8
svn log | grep user

বেশিরভাগ অংশের জন্য কাজ করে।

বা আরও নির্ভুল হতে:

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

ধন্যবাদ, তবে আমি সেইভাবে প্রতিশ্রুতিবদ্ধ বার্তাগুলি দেখতে পাচ্ছি না।
মিম্রোক

@ মিম্রোক ট্রু আপনি -Aপ্রেক্ষাপট প্রদর্শন করতে গ্রেপ করতে পারেন , তবে এই সংখ্যাটি স্থির যেখানে কমিট বার্তাটি পরিবর্তনশীল দৈর্ঘ্যের। আপনি সেড বা অনুরূপ দিয়ে একটি সমাধান করতে পারেন, তবে এটি প্রচেষ্টা। : পি
মoinনুদিন

এটি আপনি উইন্ডোজের অধীনেও কাজ করে, যদি আপনি জিআইটি এক্সটেনশানগুলি (কোড. google.com/p/gitextensions ) ইনস্টল করেন এবং জিআইটি বাশ কমান্ড প্রম্পট শুরু করেন।
কনটাঙ্গো

1
@মার্কগ সত্যিকারের সম্পূর্ণতার জন্য, সেই সংশোধনীগুলির তালিকাটি নিন এবং কেবল তাদের সাথে আরেকটি কল করুন: | awk '{ print "-" $1 }' | xargs svn log
ইজকাটা

5

Yvoyer এর সমাধানটি কার্যকরভাবে কাজ করার সময়, এখানে এসভিএন এর এক্সএমএল আউটপুটটি ব্যবহার করে এটি ভাগ করে নেওয়া হচ্ছে xmlstarlet

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

এখান থেকে আপনি আরও উন্নত এক্সএমএল ক্যোয়ারিতে যেতে পারেন।


3

এক্সস্ল্ট ব্যবহার করে আমার সমাধানটি এখানে। দুর্ভাগ্যক্রমে, যদিও, 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

আপনি ব্যবহারকারীর নাম দ্বারা লগ ফিল্টার এবং প্রতিশ্রুতি বার্তা বজায় রাখতে পার্ল ব্যবহার করতে পারেন use কেবল $ / ভেরিয়েবল সেট করুন যা পার্লের কোন "লাইন" গঠন করে তা স্থির করে। আপনি যদি এসভিএন লগের এন্ট্রিগুলির পৃথককে এটি সেট করেন, পার্ল একবারে একটি রেকর্ড পড়বে এবং তারপরে পুরো রেকর্ডে আপনার ব্যবহারকারীর নামটি মিলিয়ে নিতে সক্ষম হওয়া উচিত। নিচে দেখ:

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

আপনি যদি কোনও ফাইলের নামের উপর ভিত্তি করে একগুচ্ছ লগ ফলাফলগুলি সন্ধান করতে চান তবে এইটি কাজ করে!
ওয়ালমিক

1

চেকিন সহ পৃথকীকরণ করতে।

একটি ফাইলের মধ্যে সংশোধন নম্বর পান:

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

বিদ্যমান উত্তর যা এক্সএমএল ব্যবহার করে এবং সঠিকভাবে পার্স করে তা আরও দৃ rob় এবং নমনীয় হতে চলেছে।
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.