Bagaimana cara menampilkan komitmen pengguna tertentu dalam svn log?

161

Bagaimana cara menampilkan komitmen pengguna tertentu di svn? Saya tidak menemukan switch untuk itu untuk svn log.

mimrock
sumber
10
Gunakan --searchopsi dengan Subversion 1.8 atau klien yang lebih baru.
bahrep

Jawaban:

258

Anda bisa menggunakan ini:

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

Ini akan menunjukkan kepada Anda setiap komit yang dibuat oleh pengguna yang ditentukan (USERNAME).

MEMPERBARUI

Seperti yang disarankan oleh @bahrep, subversi 1.8 dilengkapi dengan --searchopsi.

yvoyer
sumber
6
Solusi ini sempurna. Saya ingin memahami apa yang dilakukannya tetapi saya belum dapat menemukan apa pun di dokumentasi sed yang menjelaskannya. Adakah yang punya info tentang mengapa ini berhasil?
Matt Hulse
1
+1 Berfungsi untuk saya juga. Seperti vi, pada distro Unix / Linux mungkin lebih banyak daripada Python - dan karena itu tidak perlu khawatir tentang instalasi.
therobyouknow
10
@MattHulse berfungsi karena menggunakan sed untuk mencocokkan segala sesuatu di antara dua ekspresi reguler yang ditentukan (nama pengguna dan tanda hubung), dan kemudian mengatakannya untuk mencetak (itu p).
Gijs
5
@therobyouknow Tidak, Anda tidak perlu melakukan svn logcopy pekerjaan. Anda juga dapat menentukan repositori Anda, yaitu svn log https://your-svn-repo.
MBober
4
Tidak perlu melakukan ini lagi. Gunakan Subversion 1.8 atau klien yang lebih baru yang mendukung --searchopsi.
bahrep
101

Dengan Subversion 1.8 atau yang lebih baru:

svn log --search johnsmith77 -l 50

Selain kecocokan penulis, ini juga akan mengaktifkan komit SVN yang berisi nama pengguna itu dalam pesan komit, yang seharusnya tidak terjadi jika nama pengguna Anda bukan kata yang umum.

The -l 50akan membatasi pencarian ke terbaru 50 entri.

--search ARG

Memfilter log pesan untuk menunjukkan hanya yang sesuai dengan pola pencarian ARG.

Pesan log ditampilkan hanya jika pola pencarian yang disediakan cocok dengan penulis, tanggal, teks pesan log mana pun (kecuali --quietdigunakan), atau, jika --verboseopsi juga disediakan, jalur yang diubah.

Jika beberapa --searchopsi disediakan, pesan log ditampilkan jika cocok dengan salah satu pola pencarian yang disediakan.

Jika --limitdigunakan, itu membatasi jumlah pesan log yang dicari, daripada membatasi output ke sejumlah pesan log yang cocok.

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

Michael Butler
sumber
1
@Izkata ditambahkan dalam SVN 1.8: svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
bahrep
jika Anda ingin mencari lebih dari satu penulis 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
Solusi ini dapat digunakan dengan argumen --diff juga (untuk menampilkan kode yang diubah)
joro
Adakah cara untuk menyaring tampilan dalam pesan komit, jika nama pengguna adalah kata umum?
Tor Klingberg
17

svn tidak datang dengan opsi bawaan untuk ini. Itu memang memiliki svn log --xmlopsi, untuk memungkinkan Anda mengurai output sendiri, dan mendapatkan bagian yang menarik.

Anda bisa menulis skrip untuk menguraikannya, misalnya, dengan 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)

Jika Anda menyimpan di atas sebagai svnLogStripByAuthor.py, Anda bisa menyebutnya sebagai:

svn log --xml other-options | svnLogStripByAuthor.py user
Avi
sumber
Itu sebabnya saya menambahkan tag 'bash' juga.
mimrock
Anda dapat menulis skrip utilitas untuk menguraikannya - lihat contoh saya
Avi
Saya tidak menginstal python, tetapi sementara masalah saya diselesaikan dengan cara yang tidak terkait, saya menganggap solusi Anda berfungsi, terima kasih!
mimrock
3
Sihir itu Mungkin. Python adalah Bash.
n611x007
13

Karena semua orang tampaknya condong ke linux (et al): Ini adalah padanan Windows

svn log [SVNPath]|find "USERNAME"
pengguna2197169
sumber
Terima kasih! Seorang klien menggunakan Windows sehingga sangat membantu. Ini adalah sistem yang dikelola, saya tidak memiliki hak admin dan tidak dapat menginstal cygwin / perl / apa pun ...
n13
8
svn log | grep user

bekerja untuk sebagian besar.

Atau agar lebih akurat:

svn log | egrep 'r[0-9]+ \| user \|'
moinudin
sumber
Terima kasih, tapi saya tidak bisa melihat pesan komit seperti itu.
mimrock
@ mimrock Benar. Anda dapat memilih -Auntuk menampilkan konteks, tetapi angka ini statis sedangkan pesan komit panjang variabel. Anda bisa membuat solusi dengan sed atau serupa, tapi itu upaya. : P
moinudin
Ini juga berfungsi di Windows, jika Anda menginstal GIT Extensions ( code.google.com/p/gitextensions ) dan memulai prompt perintah GIT Bash.
Contango
1
@marcog Untuk kelengkapan yang sebenarnya, ambil daftar revisi itu dan lakukan panggilan lagi hanya dengan mereka: | awk '{ print "-" $1 }' | xargs svn log
Izkata
5

Sementara solusi yvoyer berfungsi dengan baik, berikut adalah salah satu yang memanfaatkan keluaran XML SVN, menguraikannya xmlstarlet.

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

Dari sini Anda bisa masuk ke pertanyaan XML yang lebih maju.

mxgr
sumber
3

Inilah solusi saya menggunakan xslt. Sayangnya, xsltproc bukan prosesor streaming, jadi Anda harus memberi batas log. Contoh penggunaan:

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>
yonran
sumber
1

Anda dapat menggunakan Perl untuk memfilter log dengan nama pengguna dan mempertahankan pesan komit. Cukup atur $ / variabel yang memutuskan apa yang merupakan "baris" di Perl. Jika Anda mengatur ini ke pemisah dari entri log SVN, Perl akan membaca satu catatan sekaligus dan kemudian Anda harus dapat mencocokkan nama pengguna di seluruh catatan. Lihat di bawah:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
Stathis Sideris
sumber
Yang ini berfungsi bahkan jika Anda ingin menemukan banyak hasil log berdasarkan nama file!
walmik
1

Untuk mendapatkan perbedaan dengan checkin.

Dapatkan nomor revisi ke dalam file:

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

Sekarang baca file & jalankan diff untuk setiap revisi:

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

Saya telah menulis naskah dengan 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

dan gunakan:

$ 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
ruikye
sumber
Jawaban yang ada yang menggunakan XML dan mem-parsing dengan benar akan menjadi lebih kuat dan fleksibel.
tripleee