Svn günlüğünde belirli bir kullanıcının taahhütlerini nasıl görüntülerim?


161

Svn'de belirli bir kullanıcının taahhütlerini nasıl görüntülerim? Svn günlüğü için herhangi bir anahtar bulamadım.


10
--searchSubversion 1.8 veya daha yeni bir istemciyle seçeneği kullanın .
bahrep

Yanıtlar:


258

Bunu kullanabilirsiniz:

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

Belirtilen kullanıcı (USERNAME) tarafından yapılan her taahhüdü gösterir.

GÜNCELLEME

@Bahrep tarafından önerildiği gibi, yıkım 1.8 bir --searchseçenek ile geliyor .


6
Bu çözüm mükemmel. Ne yaptığını anlamak istiyorum ama sed belgelerinde açıklayan bir şey bulamadım. Bunun neden işe yaradığına dair kimse var mı?
Matt Hulse

1
+1 Benim için de çalışıyor. Vi gibi, Unix / Linux'ta distros sed belki Python'dan daha yaygındır ve bu nedenle kurulum konusunda endişelenmenize gerek yoktur.
therobyouknow

10
@MattHulse çalışır çünkü belirtilen iki normal ifade (kullanıcı adı ve tire) arasındaki her şeyi eşleştirmek için sed kullanır ve sonra bunu (the p) yazmasını söyler .
Gijs

5
@therobyouknow Hayır, svn logçalışan bir kopya üzerinde işlem yapmanız gerekmez . Deponuzu da belirtebilirsiniz svn log https://your-svn-repo.
MBober

4
Artık buna gerek yok. Subversion 1.8 ya da --searchseçeneği destekleyen daha yeni bir istemci kullanın.
bahrep

101

Subversion 1.8 veya üzeri ile:

svn log --search johnsmith77 -l 50

Yazar eşleşmelerinin yanı sıra, bu, taahhüt mesajında ​​bu kullanıcı adını içeren SVN taahhütlerini de açacaktır; bu, kullanıcı adınız ortak bir kelime değilse gerçekleşmemelidir.

Bu -l 50, aramayı en son 50 girişle sınırlar.

--search ARG

Günlük iletilerini yalnızca ARG arama modeliyle eşleşenleri göstermek için filtreler.

Günlük mesajları yalnızca sağlanan arama düzeni, yazar, tarih, günlük mesajı metninin herhangi biriyle eşleşmiyorsa ( --quietkullanılmıyorsa) veya --verboseseçenek de sağlanmışsa değiştirilmiş bir yolla görüntülenir.

Birden fazla --searchseçenek sunulursa, sağlanan arama örüntülerinden herhangi biriyle eşleşiyorsa bir günlük mesajı gösterilir.

Eğer --limitkullanılırsa, bu günlük ileti sayısı oldukça günlük iletilerini eşleşen belirli bir sayıya çıktı kısıtlamak yerine, arandı kısıtlar.

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



birden fazla yazar aramak istiyorsanız 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

Bu çözüm --diff argümanıyla da kullanılabilir (değiştirilen kodu göstermek için)
joro

Kullanıcı adı bir kelimenin ortak (parçası) bir parçasıysa, işleme iletilerindeki görünümleri filtrelemenin herhangi bir yolu var mı?
Tor Klingberg

17

svn bunun için yerleşik seçeneklerle gelmiyor. svn log --xmlÇıktıyı kendiniz ayrıştırmanıza ve ilginç parçaları almanıza izin veren bir seçeneği var .

Ayrıştırmak için bir komut dosyası yazabilirsiniz, örneğin Python 2.6'da:

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)

Yukarıdakileri svnLogStripByAuthor.py olarak kaydederseniz, şu şekilde çağırabilirsiniz:

svn log --xml other-options | svnLogStripByAuthor.py user

Bu yüzden 'bash' etiketini de ekledim.
mimrock

Ayrıştırmak için bir komut dosyası yazabilirsiniz
örneğime

Python yüklü değil, ama sorunum ilgisiz bir şekilde çözülürken, çözümünüzün çalıştığını varsayıyorum, teşekkür ederim!
mimrock

3
Sihir güç olabilir. Python, Bash.
n611x007

13

Herkes linux'a (et al) doğru eğilmiş gibi göründüğü için: İşte Windows eşdeğeri:

svn log [SVNPath]|find "USERNAME"

Teşekkürler! Bir istemci Windows'u kullanıyor, bu yüzden gerçekten yardımcı oldu. Bu yönetilen bir sistem, yönetici haklarına sahip değilim ve cygwin / perl /
what yükleyemiyorum

8
svn log | grep user

çoğunlukla çalışır.

Daha doğrusu:

svn log | egrep 'r[0-9]+ \| user \|'

Teşekkürler, ancak taahhüt mesajlarını bu şekilde göremiyorum.
mimrock

@mimrock True. -ABağlam görüntülemek için grep's kullanabilirsiniz, ancak bu sayı statiktir, ancak taahhüt mesajı değişken uzunluktadır. Sed veya benzeri bir çözüm yapabilirsiniz, ama bu çaba. : P
moinudin

Bu, GIT Uzantılarını ( code.google.com/p/gitextensions ) yükler ve bir GIT Bash komut istemi başlatırsanız Windows altında da çalışır .
Contango

1
@marcog Gerçek bütünlük için, bu revizyon listesini alın ve sadece onlarla başka bir çağrı yapın: | awk '{ print "-" $1 }' | xargs svn log
Izkata

5

Yvoyer'in çözümü iyi çalışıyor olsa da, burada SVN'nin XML çıktısını kullanarak ayrıştırmak xmlstarlet.

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

Buradan daha gelişmiş XML sorgularına girebilirsiniz.


3

İşte benim xslt kullanarak benim çözüm. Ne yazık ki, xsltproc bir akış işlemcisi değildir, bu nedenle günlüğe bir sınır vermek zorundasınız. Örnek kullanım:

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

Şu kullanıcı tarafından günlüğü süzmek için Perl kullanabilirsiniz ve taahhüt mesajları korumak. Sadece Perl'de neyin "satır" oluşturduğuna karar veren $ / değişkenini ayarlayın. Bunu SVN günlüğünün girişlerinin ayırıcısına ayarlarsanız, Perl her seferinde bir kayıt okuyacak ve daha sonra tüm kayıttaki kullanıcı adını eşleştirebilmelisiniz. Aşağıya bakınız:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'

Bu, bir dosya adına dayalı bir grup günlük sonucu bulmak isteseniz bile çalışır!
walmik

1

GET check-in ile birlikte fark.

Düzeltme numaralarını bir dosyaya alın:

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

Şimdi her revizyon için dosyayı okuyun ve diff'i yürütün:

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

0

Python tarafından bir senaryo yazdım:

#!/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

ve kullan:

$ 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

XML kullanan ve düzgün bir şekilde ayrıştıran mevcut cevap daha sağlam ve esnek olacaktır.
Üçlü
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.