तोड़फोड़ इतिहास की खोज (पूर्ण पाठ)


135

क्या सभी इतिहास सहित एक तोड़फोड़ भंडार का एक पूर्ण पाठ खोज करने का एक तरीका है?

उदाहरण के लिए, मैंने एक ऐसी सुविधा लिखी है, जिसका मैंने कहीं उपयोग किया है, लेकिन तब इसकी आवश्यकता नहीं थी, इसलिए मैंने फाइलों को जमा कर दिया, लेकिन अब मुझे इसे फिर से उपयोग करने की आवश्यकता है। Svn लॉग शायद "अप्रयुक्त सामान हटा" की तरह कुछ कहता है, और इस तरह चेकइन का भार है।

2016-04-15 को संपादित करें: कृपया ध्यान दें कि "पूर्ण पाठ खोज" शब्द से यहां क्या पूछा गया है, यह प्रतिबद्ध इतिहास के वास्तविक अंतरों को खोजना है, न कि फ़ाइल नाम और / या संदेश देना । मैं इसे इंगित कर रहा हूं क्योंकि ऊपर लेखक का वाक्यांशांकन बहुत अच्छी तरह से प्रतिबिंबित नहीं करता है - क्योंकि उसके उदाहरण में वह केवल एक फ़ाइल नाम और / या प्रतिबद्ध संदेश की तलाश में हो सकता है। इसलिए बहुत सारे svn logजवाब और टिप्पणियां।


6
Apache Subversion 1.8 कमांड के --searchलिए तर्क स्वीकार करता है svn log। मेरे जवाब को देखें stackoverflow.com/a/17473516/761095
bahrep

3
svn log --search@rjmunro द्वारा आवश्यक के रूप में एक पूर्ण पाठ खोज नहीं करता है, लेकिन केवल लेखक, दिनांक, लॉग संदेश और बदले हुए रास्तों की सूची खोजता है।
zb226

जवाबों:


77
git svn clone <svn url>
git log -G<some regex>

1
अच्छी बात। Gitk GUI इस तरह की खोज को बहुत अच्छी तरह से करता है, और एक svn रिपॉजिटरी तक पहुंचने के लिए git svn टूल्स का उपयोग करना आसान है। माना जाता है, मैं इस सवाल को पूछने के समय से पूरी तरह से गिट का उपयोग करने के लिए चला गया हूं, इसलिए इस उत्तर को स्वीकार करना मेरे लिए थोड़ा विशिष्ट हो सकता है।
rjmunro

4
सलाह दी जाती है, आपके भंडार के आकार के आधार पर इसमें कुछ समय लग सकता है। मेरे लिए यह एक घंटे से अधिक समय लगा।
user247702

20
मैंने इस समाधान को अस्वीकार कर दिया क्योंकि एक बड़े SVN रिपॉजिटरी को GIT में परिवर्तित करना अक्सर संभव नहीं होता है या बहुत लंबा होता है। यह C # भाषा निर्माण के बारे में प्रश्न होने पर जावा की सिफारिश करने जैसा है।
ooxi

3
आपको इस आदेश के लिए एक अतिरिक्त पैकेज स्थापित करने की आवश्यकता हो सकती है। उबंटू पर, आप करना चाहते हैं apt-get install git-svn
nedned

5
क्या "svn log --verbose --diff | grep ..." git का उपयोग किए बिना आपकी लगभग समान कार्यक्षमता नहीं खरीदते हैं?
गीत जुले

41

svn logअपाचे में तोड़फोड़ 1.8 एक नए --searchविकल्प का समर्थन करता है । इसलिए आप 3'rd पार्टी टूल्स और स्क्रिप्ट्स का उपयोग किए बिना सबवर्सन रिपॉजिटरी हिस्ट्री लॉग मैसेजेस को खोज सकते हैं।

svn log --search लेखक, तिथि, लॉग संदेश पाठ और बदले हुए रास्तों की सूची में खोजें।

देखें SVNBook | svn logकमांड-लाइन संदर्भ


7
आसान, लेकिन पूर्ण-पाठ खोज नहीं। मैं git-svn उत्तर के साथ चिपका रहा हूँ :-)
rjmunro

4
ऐसा नहीं है कि इस समय googlecode पर svn repos अभी भी svn 1.6 पर चल रहा है ... देखें: code.google.com/p/support/wiki/… ? लेकिन, अपने ग्राहक को 1,8 में अपडेट करना (और किसी भी चेक आउट रेपो के svn अपग्रेड) से आप रेपो पर svn लॉग - सेक का उपयोग कर सकेंगे ...
मारियो रगियर

वर्किंग कॉपी को सभी अपडेट की आवश्यकता होती है लेकिन यह कमांड रिविजन नंबर, परिवर्तित फाइल और टिप्पणी सहित पूरे बदलाव को सूचीबद्ध करता है। यह पूर्ण-पाठ कैसे नहीं है?
बर्नहार्ड डब्लर

24

यदि आप Windows चला रहे हैं, तो SvnQuery पर एक नज़र डालें । यह स्थानीय या दूरस्थ रिपॉजिटरी का पूर्ण पाठ सूचकांक रखता है। भंडार के लिए प्रतिबद्ध हर दस्तावेज अनुक्रमित हो जाता है। आप एक साधारण वेब इंटरफ़ेस से Google जैसी क्वेरी कर सकते हैं।


यह बहुत अच्छा होगा यदि SvnQuery अभी भी बनाए रखा गया था लेकिन दुख की बात है कि यह मर गया और अब यह बिल्कुल काम नहीं करता है।
डैन एटकिंसन


21

मैं एक छोटी सी गोले का उपयोग कर रहा हूं, लेकिन यह केवल एक ही फाइल के लिए काम करता है। आप इसे अधिक फ़ाइलों को शामिल करने के लिए खोज के साथ जोड़ सकते हैं।

#!/bin/bash
for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do 
  svn cat $1 -r $REV | grep -q $2
  if [ $? -eq 0 ]; then 
    echo "$REV"
  fi 
done

यदि आप वास्तव में सब कुछ खोजना चाहते हैं, तो svnadmin dumpकमांड का उपयोग करें और उसी के माध्यम से grep करें।


मुझे "r" को रिविजन नंबर से हटाना चाहिए: awk '{प्रिंट पदार्थ ($ 1,2, लंबाई ($ 1))}' और "grep" -q "विकल्प को हटाने के लिए, वास्तव में मैचों को दिखाने के लिए।
ह्यूगो

strings myDump.txt | grep "कछुए fwd 10"
jedierikb

2
और यही कारण है कि हम git को गले लगाते हैं।
सीमित प्रायश्चित

मामले को नजरअंदाज करने के लिए पिछले grep -i करना चाहते हैं और -q को वास्तव में देखने वाली पंक्ति को देख सकते हैं
Belun

13

सबसे अच्छा तरीका है कि मैं ऐसा करने के लिए मिल गया है:

svn लॉग --verbose | कम से

एक बार कम आउटपुट के साथ आने के बाद, आप /खोज के लिए हिट कर सकते हैं, जैसे VIM।

संपादित करें:

लेखक के अनुसार, वह केवल संदेशों और फ़ाइल नामों से अधिक खोज करना चाहता है। जिस मामले में आपको यहूदी बस्ती की आवश्यकता होगी, उसे कुछ इस तरह से एक साथ हैक करें:

svn diff -r0:HEAD | less

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


5
यह पूर्ण पाठ खोज नहीं है, यह लॉग और फ़ाइल नाम खोज रहा है।
rjmunro 14

यदि ऐसा है, तो आपको अधिक अभिव्यंजक प्रतिबद्ध लॉग का उपयोग करने की आवश्यकता है। यदि आप संशोधन के बीच अंतर को प्राप्त करना चाहते हैं, तो यह मोम की पूरी दूसरी गेंद है। और मुझे व्यक्तिगत रूप से ऐसा करने का कोई तरीका नहीं पता है।
जैक एम।

> svn diff -r0: HEAD> लॉग> कम लॉग विंडोज़ पर मेरी पसंद है। धन्यवाद
kingoleg

9

मैं कुछ इसी तरह की तलाश में था। सबसे अच्छा मैं OpenGrok के साथ आया हूँ । मैंने इसे अभी तक लागू करने की कोशिश नहीं की है, लेकिन आशाजनक लगता है।


मैं कई महीनों से OpenGrok का उपयोग कर रहा हूं, यह चट्टानें हैं।
मौरिसियो शेफ़र

7
svn log -v [repository] > somefile.log

भिन्न के लिए आप --diffविकल्प का उपयोग कर सकते हैं

svn log -v --diff [repository] > somefile.log

फिर विम या नैनो या जो भी आपको पसंद हो उसका उपयोग करें, और जो आप खोज रहे हैं उसकी खोज करें। आपको यह बहुत जल्दी मिल जाएगा।

यह एक फैंसी स्क्रिप्ट या स्वचालित कुछ भी नहीं है। लेकिन यह काम करता है।


AFAICS, यह प्रतिबद्ध संदेशों की खोज करेगा, न कि वास्तविक अंतरों की।
rjmunro

इसके बाद svn log -v --diff [रिपॉजिटरी]> somefile.log
JREN

6

मुक्त नहीं होने पर, आप एटलसियन से फिशे पर एक नज़र डाल सकते हैं, वही लोग जो आपको जिरा लाते हैं। यह कई अन्य उपयोगी विशेषताओं के साथ एसवीएन के खिलाफ पूर्ण पाठ खोज करता है।

http://www.atlassian.com/software/fisheye/


1
फिशये काफ़ी अच्छा है। जैसा कि आप कहते हैं, मुफ्त नहीं है, लेकिन <= 10 कमिट लाइसेंस केवल $ 10 / वर्ष है।
जेसन एस

वर्तमान में, 5 उपयोगकर्ता $ 10 हैं, लेकिन केवल 10 उपयोगकर्ताओं पर यह $ 1,000 तक कूदता है!
मावग का कहना है कि मोनिका


4

मैं बस इस समस्या में भाग गया और

svnadmin dump <repo location> |grep -i <search term>

मेरे लिए काम किया। पहली घटना का पुनरीक्षण लौटाया और उस पंक्ति को उद्धृत किया जिसकी मुझे तलाश थी।


1
केवल स्थानीय रूप से काम करता है और अगर एक भंडार बड़ा है तो बहुत समय लगेगा।
बहरेप

2

मेरे पास इसका कोई अनुभव नहीं है, लेकिन SupoSE (ओपन सोर्स, जावा में लिखा गया) एक उपकरण है जिसे ठीक इसी तरह से बनाया गया है।



1

मैं आमतौर पर वही करता हूं जो जैक एम कहता है (svn log --verbose का उपयोग करें) लेकिन मैं कम के बजाय grep करने के लिए पाइप करता हूं ।


5
यह पूर्ण पाठ खोज नहीं है, यह लॉग और फ़ाइल नाम खोज रहा है।
rjmunro 14

यह वही है जो मैं आमतौर पर कर रहा हूं, लेकिन मैंने पाया है कि lessआप टिप्पणी में केवल पंक्ति के बजाय संशोधन, तिथि आदि देख सकते हैं। यह आमतौर पर मैं वैसे भी क्या देख रहा हूँ।
जैक एम।

1

मैंने इस समस्या को हल करने के लिए एक साइबरविन बैश स्क्रिप्ट के रूप में लिखा था।

हालाँकि यह आवश्यक है कि खोज शब्द फ़िलहाल फ़ाइल सिस्टम फ़ाइल के भीतर हो। सभी फाइलें जो फाइलसिस्टम grep से मेल खाती हैं, उस फाइल के लिए सभी svn का एक grep भिन्न होता है। सही नहीं है, लेकिन अधिकांश उपयोग के लिए पर्याप्त होना चाहिए। उम्मीद है की यह मदद करेगा।

/ Usr / स्थानीय / bin / svngrep

#!/bin/bash
# Usage: svngrep $regex @grep_args

regex="$@"
pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
if [[ ! $regex ]]; then
    echo "Usage: svngrep \$regex @grep_args"
else 
    for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`;     do 
        revs="`svnrevisions $file`";
        for rev in $revs; do
            diff=`svn diff $file -r$[rev-1]:$rev \
                 --diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
            context=`echo "$diff" \
                 | grep -i --color=none   -U5 "^\(+\|-\).*$pattern" \
                 | grep -i --color=always -U5             $pattern  \
                 | grep -v '^+++\|^---\|^===\|^Index: ' \
                 `
            if [[ $context ]]; then
                info=`echo "$diff" | grep '^+++\|^---'`
                log=`svn log $file -r$rev`
                #author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`; 

                echo "========================================================================"
                echo "========================================================================"
                echo "$log"
                echo "$info"
                echo "$context"
                echo
            fi;
        done;
    done;
fi

/ Usr / स्थानीय / bin / svnrevisions

#!/bin/sh
# Usage:  svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line

file="$@"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'

प्रयास के लिए 'ए'! (सिर्फ git :) का उपयोग करें)
सीमित प्रायश्चित

-1

यदि आप यह निर्धारित करने की कोशिश कर रहे हैं कि कोड की एक विशिष्ट पंक्ति के लिए कौन सा संशोधन जिम्मेदार है, तो आप शायद इसकी तलाश कर रहे हैं:

svn blame

साभार: मूल उत्तर


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