Câu trả lời:
Bạn có thể sử dụng điều này:
svn log | sed -n '/USERNAME/,/-----$/ p'
Nó sẽ hiển thị cho bạn mọi cam kết được thực hiện bởi người dùng được chỉ định (USERNAME).
CẬP NHẬT
Theo đề xuất của @bahrep, subversion 1.8 đi kèm với một --search
tùy chọn.
p
).
svn log
trên một bản sao làm việc. Bạn cũng có thể chỉ định kho lưu trữ của bạn, tức là svn log https://your-svn-repo
.
--search
tùy chọn.
Với Subversion 1.8 trở lên:
svn log --search johnsmith77 -l 50
Bên cạnh các kết quả trùng khớp với tác giả, điều này cũng sẽ bật lên các cam kết SVN có chứa tên người dùng đó trong thông điệp cam kết, điều này không nên xảy ra nếu tên người dùng của bạn không phải là một từ phổ biến.
Các -l 50
sẽ hạn chế tìm kiếm vào 50 mục mới nhất.
--search ARG
Bộ lọc ghi nhật ký thông báo để chỉ hiển thị những thông báo khớp với mẫu tìm kiếm ARG.
Thông điệp tường trình chỉ được hiển thị nếu mẫu tìm kiếm được cung cấp khớp với bất kỳ tác giả, ngày tháng, văn bản thông điệp nhật ký (trừ khi
--quiet
được sử dụng) hoặc, nếu--verbose
tùy chọn cũng được cung cấp, một đường dẫn đã thay đổi.Nếu nhiều
--search
tùy chọn được cung cấp, thông báo nhật ký sẽ được hiển thị nếu phù hợp với bất kỳ mẫu tìm kiếm nào được cung cấp.Nếu
--limit
được sử dụng, nó sẽ hạn chế số lượng thông điệp tường trình được tìm kiếm, thay vì giới hạn đầu ra ở một số lượng thông điệp nhật ký phù hợp cụ thể.
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 không đi kèm với các tùy chọn tích hợp cho việc này. Nó có một svn log --xml
tùy chọn, để cho phép bạn tự phân tích đầu ra và nhận các phần thú vị.
Bạn có thể viết một kịch bản để phân tích cú pháp, ví dụ, trong 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)
Nếu bạn lưu ở trên dưới dạng svnLogStripByAuthor.py, bạn có thể gọi nó là:
svn log --xml other-options | svnLogStripByAuthor.py user
Vì mọi người dường như đang nghiêng về linux (et al): Đây là Windows tương đương:
svn log [SVNPath]|find "USERNAME"
svn log | grep user
làm việc cho hầu hết các phần.
Hay nói chính xác hơn:
svn log | egrep 'r[0-9]+ \| user \|'
-A
để hiển thị ngữ cảnh, nhưng số này là tĩnh trong khi thông điệp cam kết có độ dài thay đổi. Bạn có thể tạo ra một giải pháp với sed hoặc tương tự, nhưng đó là nỗ lực. : P
| awk '{ print "-" $1 }' | xargs svn log
Mặc dù giải pháp của yvoyer hoạt động tốt, đây là một cách sử dụng đầu ra XML của SVN, phân tích cú pháp bằng xmlstarlet
.
svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
--if "author = '<AUTHOR>'" \
-v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n
Từ đây bạn có thể đi vào các truy vấn XML nâng cao hơn.
Đây là giải pháp của tôi bằng xslt. Thật không may, mặc dù, xsltproc không phải là bộ xử lý phát trực tuyến, vì vậy bạn phải đưa ra giới hạn đăng nhập. Ví dụ sử dụng:
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>
Bắt đầu với Subversion 1.8, bạn có thể sử dụng --search
và --search-and
tùy chọn dòng svn log
lệnh bằng lệnh .
Vì vậy, nó nên đơn giản như chạy svn log --search JohnDoe
.
Bạn có thể sử dụng Perl để lọc nhật ký theo tên người dùng và duy trì các thông điệp cam kết. Chỉ cần đặt $ / biến quyết định cái gì tạo thành một "dòng" trong Perl. Nếu bạn đặt mục này thành dấu phân cách của các mục trong nhật ký SVN, Perl sẽ đọc một bản ghi tại một thời điểm và sau đó bạn sẽ có thể khớp tên người dùng trong toàn bộ bản ghi. Xem bên dưới:
svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
Để NHẬN khác với việc đăng ký.
Lấy số sửa đổi thành một tập tin:
svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r"
Bây giờ đọc qua tệp và thực hiện khác biệt cho mỗi sửa đổi:
while read p; do svn log -v"$p" --diff ; done < Revisions.txt
Tôi đã viết một kịch bản bởi 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
Và sử dụng:
$ 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
tùy chọn với Subversion 1.8 hoặc máy khách mới hơn.