2009-07-13 18 views
32

मैं एक स्ट्रिंग के लिए फ़ाइल के सभी संशोधन grep करना चाहता हूं। जैसे यह देखने के लिए कि कोई फ़ंक्शन जोड़ा या हटा दिया गया था।मैं सबवर्सन रिपोजिटरी में किसी फ़ाइल के सभी संशोधन कैसे खोजूं?

क्या ऐसा करने का कोई "सरल" तरीका है? (यानी एक bash कमांड लाइन अच्छा होगा।) संशोधनों और परीक्षण को व्यक्तिगत रूप से जांचकर मैन्युअल बाइनरी खोज करना बहुत कठिन और त्रुटि प्रवण लगता है।

अगर मैं बहुत चालाक एक उपयोगी विवरण के साथ परिवर्तन के लिए प्रतिबद्ध करने फिर मैं की तरह कुछ के साथ लॉग grep सकता था:

svn log myfile.c | grep my_func 

यह हालांकि एक संशोधन संख्या प्रदान नहीं करता है, तो मैं वहाँ एक बेहतर है पर शक ऐसा करने का तरीका भी।

उत्तर

31

मैं इसे

विशिष्ट उपयोग करने के लिए एक पटकथा लिखी:

perl searchrev.pl Import.php setImportStatus 

---------------------------------------------------------------------- 
r19565 | johnf | 2009-06-24 14:33:00 +0100 (Wed, 24 Jun 2009) | 1 line 
---------------------------------------------------------------------- 
line 60 $this->setImportStatus($entity_id, $entity_attr_id); 
--------------------------------------------------------------------- 
r13722 | john | 2008-03-10 17:06:14 +0000 (Mon, 10 Mar 2008) | 1 line 
--------------------------------------------------------------------- 
line 70 $this->setImportStatus($entity_id, $entity_attr_id); 
--------------------------------------------------------------------- 
r11692 | paul | 2007-05-23 10:55:45 +0100 (Wed, 23 May 2007) | 1 line 
--------------------------------------------------------------------- 
Not found 
--------------------------------------------------------------------- 
r11691 | paul | 2007-05-23 10:36:26 +0100 (Wed, 23 May 2007) | 1 line 
--------------------------------------------------------------------- 
Not found 
--------------------------------------------------------------------- 
r11683 | paul | 2007-05-23 09:04:29 +0100 (Wed, 23 May 2007) | 1 line 
--------------------------------------------------------------------- 
Not found 

यहाँ स्क्रिप्ट है, अपने स्वयं के प्रयोजनों के लिए हैक करने के लिए आसान

#!/usr/bin/perl -w 

my $file=$ARGV[0]; 
my $pattern=$ARGV[1]; 

my @history=`svn log $file`; 
foreach (@history) 
{ 
    chomp; 
    if (m/^r(\d+)/) 
    { 
     my $revision=$1; 
     my $sep='-' x length($_); 

     print "$sep\n$_\n$sep\n"; 

     my @code=`svn cat -r $revision $file`; 
     my $lineno=0; 
     my $found=0; 
     foreach my $line (@code) 
     { 
      $lineno++; 
      if ($line=~m/$pattern/) 
      { 
       $line=~s/^\s+//; 
       print "line $lineno $line"; 
       $found=1; 
      } 
     } 

     print "Not found\n" unless ($found); 
    } 
} 
+0

वर्तमान संशोधन शुरू करने के बारे में और फिर केवल diffs में grepping के बारे में कैसे? – Jann

+0

कुछ दिनों में दूसरी बार, एक खोज ने मुझे एक सवाल पूछा है जो मैंने कई साल पहले पूछा था! आपके उत्तर के लिए फिर से धन्यवाद :) – Tom

+2

+1, धन्यवाद, मुझे कुछ समय बचाया – bobah

1

पहली चीज जो आप करना चाहते हैं वह मुश्किल होगी। मैं सामान्य रूप से svn diff या svn cat का उपयोग करने का सुझाव दूंगा, लेकिन कोड आउटपुट के साथ संशोधन संख्या इनलाइन प्राप्त करने का कोई तरीका नहीं है (जहां तक ​​मुझे पता है) है।

दूसरा सवाल पर, आप एक विशिष्ट उपयोगकर्ता के लिए देख रहे हैं, तो आप उपयोग कर सकते हैं

svn log | grep -A 2 username 

जो आप हर मिलान किया पंक्ति के बाद दो अतिरिक्त लाइनें दे देंगे (-एक = "के बाद")। आप बहुत लंबे लॉग संदेश नहीं हैं, तो आप

svn log | grep -B 2 search_string 

जो इसी तरह से पहले (-B) प्रत्येक मिलान किया लाइन दो पंक्तियों प्रिंट होगा उपयोग कर सकते हैं। (जो आपको संशोधन संख्या देने के लिए पर्याप्त रूप से पर्याप्त होना चाहिए।) मुझे पूरा यकीन है कि लॉग संदेशों के साथ आपको संशोधन संख्या देने के लिए एडब्ल्यूके के साथ एक बेहतर तरीका है, लेकिन मैं थक गया हूं और मैं नहीं सोच सकता अभी इसके बारे में : डी

7

"annotate/blame" command वास्तव में क्या करता है नहीं कि आप क्या चाहते हैं, लेकिन यह मदद कर सकता है:

SVN दोष - शो लेखक और इन-लाइन निर्दिष्ट फ़ाइलों या URL के लिए संशोधन जानकारी।

$ svn blame http://svn.red-bean.com/repos/test/readme.txt 
3  sally This is a README file. 
5  harry You should read this. 

तो, आप पता लगाने के लिए जो एक समारोह जोड़ा सक्षम होना चाहिए। यह पता लगाने के लिए कि किसने फ़ंक्शन हटाया है, कोई विचार नहीं।

0

जहाँ तक मुझे पता है कि यह आसानी से संभव नहीं है। मैं एक छोटी सी स्क्रिप्ट लिखूंगा जो फ़ाइल में प्रत्येक बदलाव को प्रश्न में पुनर्प्राप्त करे और फिर स्ट्रिंग के लिए diff के माध्यम से grep। इसके बाद यह एक GET पैरामीटर के माध्यम से संशोधन संख्या निर्दिष्ट कर सकते हैं वर्तमान संशोधन संख्या :)

3

मुद्रण एक सबवर्सन 1.6 सर्वर और उसके mod_dav_svn के साथ के रूप में सरल है:

http://host/repos/path?r=20 

तो आप आसानी से wget में अपनी फ़ाइलें कर सकते हैं सभी संशोधन और फिर diff उन्हें।

स्रोत: SVN 1.6 changelog

0

आप pySVN + अजगर diff tools इस्तेमाल कर सकते हैं, जबकि यह बैश नहीं है ऐसा करने के लिए, यह हो सकता है लायक पर विचार अगर आप एक अधिक नियमित आधार पर इस समारोह का उपयोग करें।यह wget solution का एक संस्करण है, लेकिन एक अच्छे इंटरफेस है, अच्छी तरह से अगर आप का निर्माण यह :)

2

इस स्ट्रिंग वाली एक फ़ाइल के संशोधन के लिए खोज करने के लिए एक कमांड है:

svn log -l 30 -q FILENAME | grep ^r | cut -d ' ' -f 1 | while read rev; do 
    svn cat -$rev FILENAME | grep -c PATTERN && svn info [email protected]$rev 
done 
संबंधित मुद्दे