2010-03-22 11 views
58

Bir SVN deposu için ya da belirli bir kaynak yolu için benzersiz taahhüt yazarlarının listesini almanın etkili bir yolunu arıyorum. Özellikle bunun için bir SVN komutu bulamadım (ve bir tane beklemeyin) ama Terminalde (OS X'de) şu ana kadar denediğim şeyin daha iyi bir yolu olabileceğini umuyorum:Tüm Subversion commit yazar kullanıcı adları listesi nasıl alınır?

Bunlardan her biri, her satırda bir yazar adı verir, ancak her ikisi de, fazladan fazla miktarda bilgiyi filtrelemeyi gerektirir. Aynı yazar isminin kopyalarını da işlemezler, bu nedenle az sayıda yazar tarafından yapılan pek çok işlem için tel üzerinden fazla miktarda akıntı var. Daha sık sık sadece benzersiz yazar kullanıcı isimlerini görmek istiyorum. (Aslında , her bir yazar için taahhüt sayımı vesilesiyle işe yarayabilir, ancak bu durumlarda bile, toplu veriler gönderilirse daha iyi olurdu.)

Genellikle istemci ile çalışıyorum sadece erişim, bu yüzden svnadmin komutları daha az kullanışlıdır, ancak gerekirse, depo yöneticisi için kesinlikle gerekli ya da çok daha verimli bir lehte isteyebilirim. Çalıştığım depolarda onbinlerce taahhüt ve birçok aktif kullanıcı var ve ben kimseyi rahatsız etmek istemiyorum.

+6

Subversion does not * indeks * yazar adları (onlar sadece bir revizyon malısın), bu yüzden günlüğün tamamını tarayarak olmadan bunu yapmak için hiçbir yolu yoktur; Çözümler sadece taahhüt başına maliyete göre değişecektir. Yararlı öneri için –

cevap

70

Kopyaları filtrelemek için, çıktınızı alın ve şu kanallardan geçirin: sort | uniq. Böylece: Bu ne sormak yapmanın yolu ise

svn log --quiet | grep "^r" | awk '{print $3}' | sort | uniq 

şaşırmam woud. Unix araçları genellikle kullanıcının diğer araçları ile fantezi işleme ve analiz yapmasını bekler.

P.S. Eğer grep ve awk ...

svn log --quiet | awk '/^r/ {print $3}' | sort | uniq 

P.P.S. birleştirebilirsiniz, Düşününce gel Başına Kevin Reid ...

svn log --quiet | awk '/^r/ {print $3}' | sort -u 

P .S. kan Başına, daha verimli için ... (ayrıca Python örnekleri güncellendi) düzgün boşluklu isimleri yönetilmektedir,

svn log --quiet | awk -F ' \\\\|' '/^r/ {print $2}' | sort -u 

yerine alan ayırıcısı alanların dikey çubuklar kullanarak, bir Perl tek astar yapabilirdi.

#!/usr/bin/env python 
from __future__ import print_function # Python 2.6/2.7 
import sys 
authors = {} 
for line in sys.stdin: 
    if line[0] != 'r': 
     continue 
    author = line.split('|')[1].strip() 
    authors.setdefault(author, 0) 
    authors[author] += 1 
for author in sorted(authors): 
    print(author, authors[author]) 

Sonra kaçmayacağınızı:

Eğer sayıları isteseydi,

#!/usr/bin/env python 
import sys 
authors = set() 
for line in sys.stdin: 
    if line[0] == 'r': 
     authors.add(line.split('|')[1].strip()) 
for author in sorted(authors): 
    print(author) 

Veya: o kadar iyi Perl bilmiyorum, bu yüzden Python yapıyor kadar rüzgar ediyorum

svn log --quiet | ./authorfilter.py 
+0

+ 1. Ben 'sort' farkında değil, 'uniq', ve ikincisi her satır için olay sayısını prepends daha bir "-c" parametre alır gibi görünüyordu. Hala daha verimli (ve ölçeklenebilir) bir yol umuyorum, ama bu bir tutamda hile yapar. –

+5

'sort -u' 'sıralama | tek komutla uniq –

+1

Bu arada, eğer XPath elinize sahipse, '// author/text()' sorgusu sadece yazar isimlerini 'svn log --xml' den sağlam bir şekilde alacaktır. (Mac OS X'de * neredeyse * bu işi yapan bir 'xpath' komutu vardır, ancak gereksiz metin üretir ve yapılandırılamaz. Belki de başka bir şey vardır.) –

9

Ben Windows'da yapmak zorunda, bu yüzden Süper Sed Windows portu (http://www.pement.org/sed/) kullanılır - ve AWK & GREP komutları değiştirildi:

svn log --quiet --xml | sed -n -e "s/<\/\?author>//g" -e "/[<>]/!p" | sort | sed "$!N; /^\(.*\)\n\1$/!P; D" > USERS.txt 

Bu, tüm makinelerde bulunmayabilecek olan "sort" pencerelerini kullanır.

+0

Ayrıca bir klasörde yineleyen ve tüm depoların benzersiz bir listesini derleyen bir toplu iş dosyası hazırladım: http://pastebin.com/CXiqLddp –

2
svn log path-to-repo | grep '^r' | grep '|' | awk '{print $3}' | sort | uniq > committers.txt 

Bu komut yanlış değerler ortadan kaldırır ek grep '|' sahiptir. Aksi taktirde, 'r' ile başlayan rasgele taahhütler dahil edilir ve böylece taahhüt iletilerindeki kelimeler döndürülür.

+0

diğer önerilerde '--quiet' veya' -q' argümanının kullanılmasının nedeni budur. Bu yalnızca günlük başlıklarını (revizyon, yazar ve tarih, saat) basar – v01pe

34

PowerShell'de, konumunuzu çalışma kopyasına ayarlayın ve bu komutu kullanın.

svn.exe log --quiet | 
? { $_ -notlike '-*' } | 
% { ($_ -split ' \| ')[1] } | 
Sort -Unique 

svn.exe log --quiet çıkış biçimi şu şekildedir:

r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013) 
------------------------------------------------------------------------ 
r20208 | dispy | 2013-12-04 16:33:53 +0000 (Wed, 04 Dec 2013) 
------------------------------------------------------------------------ 
r20207 | lala | 2013-12-04 16:28:15 +0000 (Wed, 04 Dec 2013) 
------------------------------------------------------------------------ 
r20206 | po | 2013-12-04 14:34:32 +0000 (Wed, 04 Dec 2013) 
------------------------------------------------------------------------ 
r20205 | tinkywinky | 2013-12-04 14:07:54 +0000 (Wed, 04 Dec 2013) 

Filtre dışarı ? { $_ -notlike '-*' } Yatay çizgili. ' \| ' tarafından

r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013) 
r20208 | dispy | 2013-12-04 16:33:53 +0000 (Wed, 04 Dec 2013) 
r20207 | lala | 2013-12-04 16:28:15 +0000 (Wed, 04 Dec 2013) 
r20206 | po | 2013-12-04 14:34:32 +0000 (Wed, 04 Dec 2013) 
r20205 | tinkywinky | 2013-12-04 14:07:54 +0000 (Wed, 04 Dec 2013) 

Bölünmüş bir diziye kaydını açın.

$ 'r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)' -split ' \| ' 
r20209 
tinkywinky 
2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013) 

İkinci öğe adıdır.

Her satırın bir dizisini yapın ve ikinci öğeyi % { ($_ -split ' \| ')[1] } ile seçin. Sort -Unique ile

tinkywinky 
dispy 
lala 
po 
tinkywinky 

İade benzersiz olaylar. Bu, çıktıyı yan etki olarak sıralar.

dispy 
lala 
po 
tinkywinky 
+7

+1 Windows'da bize takılanlar için. – CrazyPyro

+0

'Sort -Unique', büyük/küçük harf duyarsız,' Sort-Object | Büyük/küçük harf duyarlı bir kontrol elde etmek için Get-Unique –AsString' veya 'Select-Object -Unique '. –

+1

Alternatif olarak: '([xml] (svn log - xml)) SeçNode ('// yazar') | % {$ _. InnerText} | Select -Unique' –

-2

Daha basit bir alternatif:

find . -name "*cpp" -exec svn log -q {} \;|grep -v "\-\-"|cut -d "|" -f 2|sort|uniq -c|sort -n 
+0

Bu, yalnızca çalışma zamanında dosya sisteminde bulunan cpp dosyalarına bakar. – echristopherson

İlgili konular