วิธีการแสดงความมุ่งมั่นของผู้ใช้เฉพาะในบันทึก svn?


161

วิธีการแสดงความมุ่งมั่นของผู้ใช้เฉพาะใน svn? ฉันไม่พบสวิตช์ใด ๆ สำหรับการบันทึก svn


10
ใช้--searchตัวเลือกกับ Subversion 1.8 หรือไคลเอนต์ที่ใหม่กว่า
bahrep

คำตอบ:


258

คุณสามารถใช้สิ่งนี้:

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

มันจะแสดงให้คุณเห็นทุกการกระทำที่ทำโดยผู้ใช้ที่ระบุ (USERNAME)

UPDATE

ตามที่แนะนำโดย @bahrep การโค่นล้ม 1.8มาพร้อมกับ--searchตัวเลือก


6
โซลูชั่นนี้สมบูรณ์แบบ ฉันอยากจะเข้าใจว่ามันกำลังทำอะไรอยู่ แต่ฉันไม่สามารถหาอะไรในเอกสารประกอบที่อธิบายได้ ใครมีข้อมูลเกี่ยวกับสาเหตุที่ใช้งานได้บ้าง
Matt Hulse

1
1 การทำงานสำหรับฉันมากเกินไป เช่น vi บน Unix / Linux distros sed อาจแพร่หลายมากกว่า Python - ดังนั้นจึงไม่ต้องกังวลเกี่ยวกับการติดตั้ง
therobyouknow

10
@MattHulse ใช้งานได้เพราะใช้ sed เพื่อจับคู่ทุกอย่างระหว่างนิพจน์ปกติที่ระบุสองรายการ (ชื่อผู้ใช้และเครื่องหมายขีดกลาง) จากนั้นบอกให้พิมพ์ (( p))
Gijs

5
@therobyouknow ไม่คุณไม่จำเป็นต้องดำเนินการsvn logกับสำเนาที่ใช้งานได้ svn log https://your-svn-repoนอกจากนี้คุณยังสามารถระบุพื้นที่เก็บข้อมูลของคุณคือ
MBober

4
ไม่จำเป็นต้องทำสิ่งนี้อีกต่อไป ใช้ Subversion 1.8 หรือไคลเอนต์ที่ใหม่กว่าที่รองรับ--searchตัวเลือก
2559

101

ด้วยการโค่นล้ม 1.8 หรือใหม่กว่า:

svn log --search johnsmith77 -l 50

นอกจากการจับคู่ผู้แต่งแล้วสิ่งนี้จะทำให้ SVN ยอมรับว่ามีชื่อผู้ใช้นั้นในข้อความยืนยันซึ่งไม่ควรเกิดขึ้นหากชื่อผู้ใช้ของคุณไม่ใช่คำทั่วไป

-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 30ถ้าคุณต้องการค้นหามากกว่าหนึ่งผู้เขียน If multiple --search options are provided, a log message is shown if it matches any of the provided search patterns.
zhuguowei

การแก้ปัญหานี้สามารถนำมาใช้กับการโต้แย้ง --diff เกินไป (จะแสดงรหัสการเปลี่ยนแปลง)
Joro

วิธีใดในการกรองการปรากฏในการส่งข้อความหากชื่อผู้ใช้เป็นคำทั่วไป (ส่วนหนึ่งของคำ)?
Tor Klingberg

17

svn ไม่ได้มาพร้อมกับตัวเลือกในตัวสำหรับสิ่งนี้ มันมีsvn log --xmlตัวเลือกเพื่อให้คุณแยกวิเคราะห์ผลลัพธ์ด้วยตัวคุณเองและรับส่วนที่น่าสนใจ

คุณสามารถเขียนสคริปต์เพื่อวิเคราะห์คำตัวอย่างใน Python 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

นั่นเป็นเหตุผลที่ฉันเพิ่มแท็ก 'bash' ด้วย
mimrock

คุณสามารถเขียนสคริปต์อรรถประโยชน์เพื่อแยกวิเคราะห์ - ดูตัวอย่างของฉัน
Avi

ฉันไม่ได้ติดตั้งงูหลาม แต่ในขณะที่ปัญหาของฉันได้รับการแก้ไขอย่างไม่เกี่ยวข้องฉันคิดว่าวิธีแก้ปัญหาของคุณใช้งานได้ดีขอบคุณ!
mimrock

3
Magic is Might Python คือ Bash
n611x007

13

เนื่องจากทุกคนดูเหมือนจะเอนเอียงไปที่ linux (et al): นี่คือ Windows ที่เทียบเท่า:

svn log [SVNPath]|find "USERNAME"

ขอบคุณ! ลูกค้าใช้ Windows เพื่อช่วยจริงๆ นี่คือระบบที่มีการจัดการฉันไม่มีสิทธิ์ของผู้ดูแลระบบและไม่สามารถติดตั้ง cygwin / perl / อะไรก็ตาม ...
n13

8
svn log | grep user

ทำงานได้เป็นส่วนใหญ่

หรือให้แม่นยำยิ่งขึ้น:

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

ขอบคุณ แต่ฉันไม่เห็นข้อความที่ส่งถึงที่นั้น
mimrock

@imrock จริง คุณสามารถ grep -Aเพื่อแสดงบริบท แต่หมายเลขนี้เป็นแบบสแตติกในขณะที่ข้อความการส่งข้อความมีความยาวผันแปรได้ คุณสามารถแก้ปัญหาด้วย sed หรือคล้ายกัน แต่นั่นคือความพยายาม : P
moinudin

สิ่งนี้สามารถใช้งานได้ใน Windows หากคุณติดตั้ง GIT Extensions ( code.google.com/p/gitextensions ) และเริ่มต้นพรอมต์คำสั่ง GIT Bash
Contango

1
@marcog เพื่อความสมบูรณ์ที่แท้จริงใช้รายการของการแก้ไขและโทรอีกครั้งกับพวกเขาเพียง: | awk '{ print "-" $1 }' | xargs svn log
Izkata

5

ในขณะที่การแก้ปัญหาของ yvoyer ทำงานได้ดีที่นี่เป็นหนึ่งในการใช้ทำของการส่งออก XML SVN 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

คุณสามารถใช้ Perl เพื่อกรองบันทึกโดยชื่อผู้ใช้และรักษาข้อความกระทำ เพียงแค่ตั้งค่าตัวแปร $ / ซึ่งเป็นตัวกำหนดสิ่งที่ถือเป็น "เส้น" ใน Perl หากคุณตั้งค่านี้เป็นตัวคั่นของรายการบันทึก SVN Perl จะอ่านหนึ่งระเบียนในแต่ละครั้งจากนั้นคุณควรจะสามารถจับคู่ชื่อผู้ใช้ในระเบียนทั้งหมดได้ ดูด้านล่าง:

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

อันนี้ใช้งานได้แม้ว่าคุณต้องการค้นหาผลลัพธ์บันทึกจำนวนมากตามชื่อไฟล์!
walmik

1

เพื่อรับความแตกต่างพร้อมกับเช็คอิน

รับหมายเลขการแก้ไขเป็นไฟล์:

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

ตอนนี้อ่านไฟล์ & การดำเนินการ diff สำหรับแต่ละการแก้ไข:

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

0

ฉันได้เขียนสคริปต์โดย Python:

#!/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 และวิเคราะห์คำอย่างถูกต้องจะมีความแข็งแกร่งและยืดหยุ่นมากขึ้น
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.