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.