Làm cách nào để hiển thị các cam kết cụ thể của người dùng trong nhật ký svn?


161

Làm cách nào để hiển thị các cam kết cụ thể của người dùng trong svn? Tôi không tìm thấy bất kỳ thiết bị chuyển mạch nào cho nhật ký svn.


10
Sử dụng --searchtùy chọn với Subversion 1.8 hoặc máy khách mới hơn.
bahrep

Câu trả lời:


258

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 --searchtùy chọn.


6
Giải pháp này là hoàn hảo. Tôi muốn hiểu những gì nó đang làm nhưng tôi không thể tìm thấy bất cứ điều gì trong tài liệu sed giải thích nó. Bất cứ ai có bất kỳ thông tin về lý do tại sao điều này làm việc?
Matt Hulse

1
+1 Hoạt động với tôi quá. Giống như vi, trên Unix / Linux distros sed có lẽ phổ biến hơn Python - và do đó không cần phải lo lắng về việc cài đặt.
trị liệu

10
@MattHulse nó hoạt động vì nó sử dụng sed để khớp mọi thứ giữa hai biểu thức chính quy định (tên người dùng và dấu gạch ngang), và sau đó bảo nó in nó (cái p).
Gijs

5
@therobyouledge Không, bạn không cần phải thực hiện svn logtrê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.
MBober

4
Không cần phải làm điều này nữa. Sử dụng Subversion 1.8 hoặc máy khách mới hơn hỗ trợ --searchtùy chọn.
bahrep

101

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 50sẽ 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 --searchtù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


1
@Izkata thêm vào trong SVN 1.8: svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
bahrep

nếu bạn muốn tìm kiếm nhiều hơn một tác giả , 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/03/2016

Giải pháp này cũng có thể được sử dụng với đối số --diff (để hiển thị mã đã thay đổi)
joro

Bất kỳ cách nào để lọc xuất hiện trong các thông điệp cam kết, nếu tên người dùng là một từ chung (một phần) của một từ?
Tor Klingberg

17

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 --xmltù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

Đó là lý do tại sao tôi cũng đã thêm thẻ 'bash'.
bắt chước

Bạn có thể viết một tập lệnh tiện ích để phân tích cú pháp - xem ví dụ của tôi
Avi

Tôi chưa cài đặt python, nhưng trong khi vấn đề của tôi được giải quyết theo cách không liên quan, tôi cho rằng giải pháp của bạn đang hoạt động, cảm ơn bạn!
bắt chước

3
Ma thuật là sức mạnh. Con trăn là Bash.
n611x007

13

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"

Cảm ơn! Một khách hàng đang sử dụng Windows để thực sự có ích. Đây là một hệ thống được quản lý, tôi không có quyền quản trị và không thể cài đặt cygwin / perl / bất cứ điều gì ...
n13

8
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 \|'

Cảm ơn, nhưng tôi không thể thấy các thông điệp cam kết theo cách đó.
bắt chước

@mimrock Đúng. Bạn có thể grep's -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
moinudin

Điều này cũng hoạt động trong Windows, nếu bạn cài đặt Tiện ích mở rộng GIT ( code.google.com/p/gitextensions ) và bắt đầu một dấu nhắc lệnh GIT Bash.
Contango

1
@marcog Để hoàn thiện thực sự, hãy lấy danh sách sửa đổi đó và thực hiện một cuộc gọi khác chỉ với họ: | awk '{ print "-" $1 }' | xargs svn log
Izkata

5

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.


3

Đâ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>------------------------------------------------------------------------&#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

Bạn có thể sử dụng Perl để lọc nhật ký theo tên người dùng 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/'

Cái này hoạt động ngay cả khi bạn muốn tìm một loạt các kết quả nhật ký dựa trên tên tệp!
walmik

1

Để 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 

0

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

Câu trả lời hiện có sử dụng XML và phân tích cú pháp chính xác sẽ trở nên mạnh mẽ và linh hoạt hơn.
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.