कैसे सभी तोड़फोड़ प्रतिबद्ध लेखक उपयोगकर्ता नामों की एक सूची प्राप्त करने के लिए?


83

मैं एसवीएन रिपॉजिटरी के लिए संपूर्ण या एक दिए गए संसाधन पथ के लिए अद्वितीय प्रतिबद्ध लेखकों की सूची प्राप्त करने के लिए एक कुशल तरीके की तलाश कर रहा हूं। मैं इसके लिए विशेष रूप से एक SVN कमांड नहीं ढूंढ पाया (और एक की उम्मीद नहीं करता), लेकिन मैं उम्मीद कर रहा हूं कि एक बेहतर तरीका हो सकता है कि मैंने टर्मिनल (OS X पर) में अब तक क्या कोशिश की है:

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

svn log --quiet --xml | grep author | sed -E "s:</?author>::g"

इनमें से कोई भी मुझे प्रति पंक्ति एक लेखक का नाम देगा, लेकिन उन्हें अतिरिक्त जानकारी के लिए उचित मात्रा में फ़िल्टरिंग की आवश्यकता होती है। वे एक ही लेखक के नाम के डुप्लिकेट को भी नहीं संभालते हैं, इसलिए कुछ लेखकों द्वारा बहुत से कमिट के लिए, तार पर बहने वाली अतिरेक क्षमता है। अधिक बार नहीं मैं सिर्फ अद्वितीय लेखक उपयोगकर्ता नाम देखना चाहता हूं। (यह वास्तव में अवसर पर प्रत्येक लेखक के लिए कमिट अनुमान लगाने के लिए आसान हो सकता है, लेकिन इन मामलों में भी बेहतर होगा यदि एकत्रित डेटा को इसके बजाय भेजा जाए।)

मैं आम तौर पर क्लाइंट-केवल एक्सेस के साथ काम कर रहा हूं, इसलिए svnadminकमांड कम उपयोगी हैं, लेकिन यदि आवश्यक हो, तो मैं रिपॉजिटरी एडमिन के एक विशेष पक्ष को पूछने में सक्षम हो सकता हूं अगर सख्ती से आवश्यक हो या बहुत अधिक कुशल। मैं जिन रिपॉजिटरी के साथ काम कर रहा हूं उनमें हजारों कमिट और कई सक्रिय उपयोगकर्ता हैं, और मैं किसी को भी असुविधा नहीं करना चाहता।


6
तोड़फोड़ लेखक के नामों को अनुक्रमित नहीं करता है (वे केवल एक संशोधन संपत्ति हैं), इसलिए पूरे लॉग को स्कैन किए बिना इसे करने का कोई तरीका नहीं है; समाधान केवल प्रति प्रतिबद्ध लागत से भिन्न होंगे।
केविन रीड

जवाबों:


94

डुप्लिकेट को फ़िल्टर करने के लिए, के माध्यम से अपने उत्पादन और पाइप ले: sort | uniq। इस प्रकार:

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

मैं आश्चर्यचकित नहीं हूं कि अगर आप पूछते हैं कि यह तरीका है। यूनिक्स उपकरण अक्सर उपयोगकर्ता से अन्य उपकरणों के साथ फैंसी प्रसंस्करण और विश्लेषण करने की अपेक्षा करते हैं।

पुनश्च यह सोचने के लिए आओ, तुम grepऔर विलय कर सकते हैं awk...

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

PPS प्रति केविन रीड ...

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

पी 3 एस। क्षेत्र विभाजक के रूप में रिक्त स्थान के बजाय ऊर्ध्वाधर सलाखों का उपयोग करके प्रति कान, रिक्त स्थान के साथ नामों को ठीक से संभालने के लिए (पायथन उदाहरणों को भी अद्यतन किया गया ...)

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

अधिक कुशल के लिए, आप एक पर्ल-लाइनर कर सकते हैं। मैं पर्ल को अच्छी तरह से नहीं जानता, इसलिए मैं इसे पायथन में कर रहा हूँ:

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

या, यदि आप गिनती चाहते थे:

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

तब आप दौड़ेंगे:

svn log --quiet | ./authorfilter.py

उपयोगी सुझाव के लिए +1। मुझे पता था कि sortनहीं uniq, लेकिन ऐसा लगता है कि उत्तरार्द्ध -cप्रत्येक पंक्ति के लिए होने वाली घटनाओं की संख्या को मापता है। मैं अभी भी अधिक कुशल (और स्केलेबल) तरीके की उम्मीद कर रहा हूं, लेकिन यह एक चुटकी में चाल करता है।
क्विन टेलर

2
वैसे, यदि आपके पास एक्सपीथ काम है, तो क्वेरी //author/text()को केवल लेखक के नाम को svn log --xmlमजबूती से प्राप्त होगा । (मैक ओएस एक्स में एक xpathकमांड है जो लगभग यह काम करता है, लेकिन बाहरी पाठ का उत्पादन करता है और इसे कॉन्फ़िगर नहीं किया जा सकता है। हो सकता है कि कुछ और हो।)
केविन रीड

@ केविन, आपको अपना जवाब जोड़ना चाहिए ताकि लोग आपको वोट दे सकें। मुझे आपकी सभी टिप्पणियां पसंद हैं, विशेष रूप से सॉर्ट / यूनीक टिप।
क्विन टेलर

1
चूंकि svn उपयोगकर्ता नाम में स्थान हो सकता है, इसलिए बेहतर होगा कि अधिक सटीक फ़िल्टरिंग का उपयोग करेंawk -F " \\\\| " '{print $2}'
kan

2
महान जवाब, हालांकि मुझे svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -u
जाग

51

PowerShell में, अपना स्थान कार्य प्रतिलिपि में सेट करें और इस आदेश का उपयोग करें।

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

इस svn.exe log --quietतरह दिखता है का आउटपुट स्वरूप :

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)

के साथ क्षैतिज नियमों को फ़िल्टर करें ? { $_ -notlike '-*' }

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)

' \| 'एक सरणी में एक रिकॉर्ड चालू करने के लिए विभाजित करें ।

$ '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)

दूसरा तत्व नाम है।

प्रत्येक पंक्ति की एक सरणी बनाएं और दूसरे तत्व का चयन करें % { ($_ -split ' \| ')[1] }

tinkywinky
dispy
lala
po
tinkywinky

अद्वितीय घटनाओं के साथ लौटें Sort -Unique। यह साइड इफेक्ट के रूप में आउटपुट को सॉर्ट करता है।

dispy
lala
po
tinkywinky

1
Sort -Uniqueकेस संवेदी है, तो आप का उपयोग करना चाहिए Sort-Object | Get-Unique –AsStringया Select-Object -Uniqueबजाय एक केस संवेदी जांच प्राप्त करने के लिए।
टॉम कुजस्टन

2
वैकल्पिक रूप से:([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
नाथन मोइनवाज़िरी

9

मुझे विंडोज में ऐसा करना था, इसलिए मैंने सुपर सेड ( http://www.pement.org/sed/ ) के विंडोज पोर्ट का उपयोग किया - और AWK और GREP कमांड को बदल दिया:

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

यह विंडोज़ "सॉर्ट" का उपयोग करता है जो सभी मशीनों पर मौजूद नहीं हो सकता है।


मैंने एक बैच फ़ाइल भी बनाई है जो एक फ़ोल्डर के माध्यम से पुनरावृत्त करता है और सभी रिपॉजिटरी की एक अद्वितीय सूची संकलित करता है: pastebin.com/CXiqLddp
एडम रोफर

4

एक दूरस्थ रिपॉजिटरी जिसका आप उपयोग कर सकते हैं:

 svn log --quiet https://url/svn/project/ | grep "^r" | awk '{print $3}' | sort | uniq

मुझे यह आदेश तब तक नहीं मिला जब तक मैंने इसे अपने आप से नहीं खोज लिया ... यदि आप केवल दूरस्थ रिपॉजिटरी के उपयोगकर्ताओं को उदाहरण के लिए इसे git में बदलना चाहते हैं (देखें git svn --help) यह वास्तव में इस कमांड को निष्पादित करने के लिए चेकआउट के रूप में उपयोगी है बहुत अधिक समय लग सकता है।
सय्यफहनी

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

इस आदेश में अतिरिक्त है grep '|'जो गलत मानों को समाप्त करता है। अन्यथा, यादृच्छिक रूप से शुरू होने के साथ शुरू होता है 'r'और इस प्रकार प्रतिबद्ध संदेशों के शब्द वापस आ जाते हैं।


यही कारण है कि अन्य सुझावों में --quietया -qतर्क का उपयोग क्यों किया जाता है। यह केवल लॉग हेडर (संशोधन, लेखक और दिनांक, समय) को प्रिंट करता है
v01pe

1

खिड़कियों के लिए एक समाधान 10।

  1. एक बैच फ़ाइल बनाएँ printAllAuthor.bat
@echo off
for /f "tokens=3" %%a in ('svn log --quiet ^|findstr /r "^r"') do echo %%a
@echo on
  1. sortकमांड के साथ बैट फाइल चलाएं
printAllAuthor.bat | sort /unique >author.txt

पुनश्च:

  • चरण 2 को सही पथ के साथ बैच फ़ाइल को चलाने की आवश्यकता है। % PATH% में या तो पथ सेट करें या सही OS पथ प्रारूप का उपयोग करें।
  • चरण 2 को आपकी आवश्यकताओं के अनुसार एक बैच फ़ाइल में बनाया जा सकता है।

0

Powershell में XML के लिए समर्थन है जो स्ट्रिंग आउटपुट को पार्स करने की आवश्यकता को समाप्त करता है।

यहाँ एक त्वरित स्क्रिप्ट है जिसका उपयोग मैंने एक मैक पर कई रिपॉजिटरी में उपयोगकर्ताओं की एक अनूठी सूची प्राप्त करने के लिए किया।

#!/usr/bin/env pwsh

$repos = @(
    'Common/'
    'Database/'
    'Integration/'
    'Reporting/'
    'Tools/'
    'Web/'
    'Webservices/'
)

foreach ($repo in $repos) {
    $url = "https://svn.example.com:8443/svn/$repo"
    $users += ([Xml](svn log $url --xml)).log.logentry.author | Sort-Object -Unique
}

$users | Sort-Object -Unique

-2

एक सरल विकल्प:

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

यह केवल cpp फ़ाइलों को देखता है जो उस समय फाइल सिस्टम में मौजूद होती हैं जब यह चलाया जाता है।
इक्रिस्टोफ़र्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.