Jawaban:
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 --search
opsi.
p
).
svn log
copy pekerjaan. Anda juga dapat menentukan repositori Anda, yaitu svn log https://your-svn-repo
.
--search
opsi.
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 50
akan 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
--quiet
digunakan), atau, jika--verbose
opsi juga disediakan, jalur yang diubah.Jika beberapa
--search
opsi disediakan, pesan log ditampilkan jika cocok dengan salah satu pola pencarian yang disediakan.Jika
--limit
digunakan, 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
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 tidak datang dengan opsi bawaan untuk ini. Itu memang memiliki svn log --xml
opsi, 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
Karena semua orang tampaknya condong ke linux (et al): Ini adalah padanan Windows
svn log [SVNPath]|find "USERNAME"
svn log | grep user
bekerja untuk sebagian besar.
Atau agar lebih akurat:
svn log | egrep 'r[0-9]+ \| user \|'
-A
untuk menampilkan konteks, tetapi angka ini statis sedangkan pesan komit panjang variabel. Anda bisa membuat solusi dengan sed atau serupa, tapi itu upaya. : P
| awk '{ print "-" $1 }' | xargs svn log
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.
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>------------------------------------------------------------------------
</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>
Dimulai dengan Subversion 1.8, Anda dapat menggunakan --search
dan --search-and
opsi baris svn log
perintah dengan perintah .
Jadi itu harus sesederhana berlari svn log --search JohnDoe
.
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/'
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
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
--search
opsi dengan Subversion 1.8 atau klien yang lebih baru.