วิธีการแสดงความมุ่งมั่นของผู้ใช้เฉพาะใน svn? ฉันไม่พบสวิตช์ใด ๆ สำหรับการบันทึก svn
วิธีการแสดงความมุ่งมั่นของผู้ใช้เฉพาะใน svn? ฉันไม่พบสวิตช์ใด ๆ สำหรับการบันทึก svn
คำตอบ:
คุณสามารถใช้สิ่งนี้:
svn log | sed -n '/USERNAME/,/-----$/ p'
มันจะแสดงให้คุณเห็นทุกการกระทำที่ทำโดยผู้ใช้ที่ระบุ (USERNAME)
UPDATE
ตามที่แนะนำโดย @bahrep การโค่นล้ม 1.8มาพร้อมกับ--search
ตัวเลือก
p
))
svn log
กับสำเนาที่ใช้งานได้ svn log https://your-svn-repo
นอกจากนี้คุณยังสามารถระบุพื้นที่เก็บข้อมูลของคุณคือ
--search
ตัวเลือก
ด้วยการโค่นล้ม 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
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
ตัวเลือกเพื่อให้คุณแยกวิเคราะห์ผลลัพธ์ด้วยตัวคุณเองและรับส่วนที่น่าสนใจ
คุณสามารถเขียนสคริปต์เพื่อวิเคราะห์คำตัวอย่างใน 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
เนื่องจากทุกคนดูเหมือนจะเอนเอียงไปที่ linux (et al): นี่คือ Windows ที่เทียบเท่า:
svn log [SVNPath]|find "USERNAME"
svn log | grep user
ทำงานได้เป็นส่วนใหญ่
หรือให้แม่นยำยิ่งขึ้น:
svn log | egrep 'r[0-9]+ \| user \|'
-A
เพื่อแสดงบริบท แต่หมายเลขนี้เป็นแบบสแตติกในขณะที่ข้อความการส่งข้อความมีความยาวผันแปรได้ คุณสามารถแก้ปัญหาด้วย sed หรือคล้ายกัน แต่นั่นคือความพยายาม : P
| awk '{ print "-" $1 }' | xargs svn log
ในขณะที่การแก้ปัญหาของ 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 ขั้นสูงเพิ่มเติมได้
นี่คือทางออกของฉันโดยใช้ 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
ดังนั้นจึงควรจะเป็นง่ายๆเป็นที่ทำงาน
คุณสามารถใช้ Perl เพื่อกรองบันทึกโดยชื่อผู้ใช้และรักษาข้อความกระทำ เพียงแค่ตั้งค่าตัวแปร $ / ซึ่งเป็นตัวกำหนดสิ่งที่ถือเป็น "เส้น" ใน Perl หากคุณตั้งค่านี้เป็นตัวคั่นของรายการบันทึก SVN Perl จะอ่านหนึ่งระเบียนในแต่ละครั้งจากนั้นคุณควรจะสามารถจับคู่ชื่อผู้ใช้ในระเบียนทั้งหมดได้ ดูด้านล่าง:
svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
เพื่อรับความแตกต่างพร้อมกับเช็คอิน
รับหมายเลขการแก้ไขเป็นไฟล์:
svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r"
ตอนนี้อ่านไฟล์ & การดำเนินการ diff สำหรับแต่ละการแก้ไข:
while read p; do svn log -v"$p" --diff ; done < Revisions.txt
ฉันได้เขียนสคริปต์โดย 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
--search
ตัวเลือกกับ Subversion 1.8 หรือไคลเอนต์ที่ใหม่กว่า