मैं SVN में फ़ाइल में सभी ऐतिहासिक परिवर्तन कैसे देख सकता हूँ


169

मुझे पता है कि मैं svn diff -r a:b repo दो निर्दिष्ट संशोधनों के बीच परिवर्तनों को देख सकता हूं । जो मैं चाहूंगा वह हर संशोधन के लिए एक फ़ाइल है जिसने फ़ाइल को बदल दिया है। क्या ऐसा आदेश उपलब्ध है?


16
यह अजीब तरह से नामित "दोष" आदेश में छिपा हुआ है।
गोसमंजैक

6
मुझे लगा कि @goosemanjack तब तक मज़ाक कर रहा था, जब तक मैंने कोशिश नहीं की।
एसएसएच यह

जवाबों:


181

इसके लिए कोई अंतर्निहित कमांड नहीं है, इसलिए मैं आमतौर पर ऐसा कुछ करता हूं:

#!/bin/bash

# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs.  The first revision of the file is emitted as
# full text since there's not previous version to compare it to.

function history_of_file() {
    url=$1 # current url of file
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {

#       first revision as full text
        echo
        read r
        svn log -r$r $url@HEAD
        svn cat -r$r $url@HEAD
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
        done
    }
}

फिर, आप इसे कॉल कर सकते हैं:

history_of_file $1

35
मैंने पहले कभी नहीं देखा है कि "लट में अवरुद्ध पाइप" चाल से पहले। साफ।

5
इस स्क्रिप्ट का बैच फ़ाइल संस्करण , fwiw।
लादेनगे

मैंने इसे अपनी .bashrc फ़ाइल में जोड़ा। जब मैं स्टार्ट-अप करता हूं तो मुझे svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
फ्रैंकिस्क0

1
@ Francisco0: अपने bashrc में अंतिम पंक्ति को शामिल न करें। यह फ़ंक्शन परिभाषा का हिस्सा नहीं है, यह फ़ंक्शन के लिए एक कॉल है क्योंकि दिए गए उदाहरण स्टैंड-अलोन स्क्रिप्ट के रूप में उपयोग करने के लिए अभिप्रेत है।
बेंडिन

26
svn log --diff [path_to_file]इस तरह से काम करता है! stackoverflow.com/a/24938573/3185510
वेबस्टर

143

जो आपने वर्णित किया है उससे थोड़ा अलग है, लेकिन मुझे लगता है कि यह वही हो सकता है जो आपको वास्तव में चाहिए:

svn blame filename

यह उस समय के लेखक द्वारा लिखी गई प्रत्येक पंक्ति के साथ फाइल को प्रिंट करेगा और इसे अंतिम रूप देने वाले लेखक का।


4
वाह यह कमाल है! सालों से SVN का उपयोग कर रहे हैं और इस बारे में कभी नहीं जानते हैं: O
Yes Barry

4
टाइमस्टैम्प देखने के लिए आपको वर्बोज़ / -वी विकल्प की आवश्यकता हो सकती है (मैं svn 1.7.9 के अपने डिफ़ॉल्ट निर्माण के साथ करता हूं)।
वेस्टन सी

मेरे प्रोफेसर ने svn के लिए प्रारंभिक दोष प्लगइन लिखा था। मुझे यह अभी भी देखना था। वह पूरी तरह से इस असाइनमेंट में सेल्फ फिल कर रहे हैं। : पी
जोसेफ डेली १३'१४

93

यदि आप कोड परिवर्तन के साथ फाइल का पूरा इतिहास देखना चाहते हैं:

svn log --diff [path_to_file] > log.txt

3
मुझे नहीं पता कि कब --diff विकल्प जोड़ा गया है, लेकिन यह svn 1.8.10 के साथ काम करता है, इसलिए बैश स्क्रिप्ट की कोई ज़रूरत नहीं है
Guillaume Gros

1
मुझे लगता है, svn 1.7.4 ने विकल्प पेश किया --diffक्योंकि इसमें विकल्प के लिए परीक्षण हैं जबकि 1.7.3 में कोई नहीं है - subversion/tests/cmdline/log_tests.py
वैध

बस एक छोटा सा नोट: इतिहास की लंबाई के आधार पर, यह कुछ समय ले सकता है इससे पहले कि log.txt फ़ाइल पूरी तरह से प्रदान की जाती है (हालांकि यह तुरंत पढ़ने योग्य होगा)।
इवान डर्स्ट

1
सबसे हाल के एक्स संशोधनों में कोई इसे कैसे सीमित करता है?
पहेली

@ ईनिग्मा: --limit <number>विकल्प के साथ । जैसे:svn log --diff --limit 5 [path_to_file]
रीड करें

37

आप git-svnरिपॉजिटरी को Git रिपॉजिटरी में आयात करने के लिए उपयोग कर सकते हैं , फिर उपयोग करें git log -p filename। यह संबंधित अंतर के बाद फ़ाइल के लिए प्रत्येक लॉग प्रविष्टि दिखाता है।


27
Git स्थापित करें, git रिपॉजिटरी बनाएं, git कमांड का उपयोग करें? प्रश्न को टैग किया गया और तोड़फोड़ के बारे में पूछा गया।
केन जेंटल

21
मैं git-svn के साथ एक सबवर्सन क्लाइंट के रूप में git का उपयोग करता हूं। यह है कि मैं एक सबवर्सन रिपॉजिटरी के खिलाफ लॉग + भिन्न ऑपरेशन कैसे करूंगा। Git के पास रिपॉजिटरी देखने के लिए कुछ बहुत बढ़िया उपकरण हैं, यह इस तरह का एक विचार नहीं है।
ग्रेग हेविल जिल

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

यह एकमात्र उत्तर भी है जो आपको फ़ाइल के इतिहास को देखने के लिए GUI (पसंद का) का उपयोग करने की अनुमति देता है। अन्य उत्तरों ने यह भी नहीं बताया है कि अंतिम X संशोधनों (सभी पर संभव?) को कैसे सीमित किया जाए, जो कि आसान है। git log X..Y -o filename
TamaMcGlinn

21

के साथ शुरू

svn log -q file | grep '^r' | cut -f1 -d' '

इससे आपको उन संशोधनों की सूची मिल जाएगी जहां फ़ाइल बदल गई थी, जिसे आप बाद में बार-बार कॉल करने के लिए स्क्रिप्ट का उपयोग कर सकते हैं svn diff


4
या ... चलते रहो! svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txtअच्छा सा एक लाइनर (awk कट के समान ही करता है)
कासापो

8

अजीब तरह से नामित "दोष" कमांड ऐसा करता है। यदि आप कछुआ का उपयोग करते हैं, तो यह आपको "पुनरीक्षण" संवाद से देता है, फिर एक फाइल सूची जिसमें रेखा के पास एक पंक्ति होती है और उसके बगल में लेखक होता है।

यदि आप संशोधन जानकारी पर राइट क्लिक करते हैं, तो आप एक "शो लॉग" डायलॉग ला सकते हैं, जो पूरी चेकइन की जानकारी देता है, साथ ही अन्य फाइलें जो चेकइन का हिस्सा थीं।


1
यह बहुत उपयोगी है, लेकिन वह नहीं जो ओपी देख रहा था, जो कि फाइल का पूरा इतिहास है, न कि केवल वर्तमान फ़ाइल का ऐतिहासिक योगदान। यह पूरा इतिहास उपयोगी है जब यह पता लगाने के लिए कि कुछ कोड को क्यों हटाया गया या बदल दिया गया, और कब।
एडम टोले

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

क्या यह अच्छा नहीं होगा अगर कमांड का स्पष्ट नाम "दोष" के बजाय "क्रेडिट" हो? :)
निक

1
@ निन स्वन स्तुति, स्वलीन दोष के लिए एक उपनाम है, जो इस बात पर निर्भर करता है कि कोई कैसा महसूस करता है।
स्टेफगोसेलिन

@stefgosselin - उस नोट के लिए धन्यवाद। मुझे पता है कि वहाँ एक विकल्प है खुश हूँ! :)
निक

3

जहाँ तक मुझे पता है कि इसे पूरा करने के लिए svn कमांड में कोई निर्माण नहीं किया गया है। आपको सभी भिन्नताओं को बनाने के लिए कई कमांड चलाने के लिए एक स्क्रिप्ट लिखने की आवश्यकता होगी। एक सरल दृष्टिकोण एक GUI svn ग्राहक का उपयोग करना होगा यदि वह एक विकल्प है। उनमें से कई जैसे कि ग्रहण के लिए विध्वंसक प्लगइन एक फ़ाइल के इतिहास को सूचीबद्ध करेगा और साथ ही आपको प्रत्येक संशोधन के रूप को देखने की अनुमति देगा।


3

धन्यवाद, बेंडिन। मुझे आपका समाधान बहुत पसंद है।

मैंने इसे हाल के परिवर्तनों को दिखाते हुए रिवर्स ऑर्डर में काम करने के लिए बदल दिया। जो लंबे समय से स्थायी कोड के साथ महत्वपूर्ण है, कई वर्षों से बनाए रखा गया है। मैं आमतौर पर इसे अधिक में पाइप करता हूं।

svnhistory elements.py |more

मैंने -r को सॉर्ट में जोड़ा। मैंने कल्पना को हटा दिया। 'पहले रिकॉर्ड' के लिए हैंडलिंग। यह अंतिम प्रविष्टि पर त्रुटि करेगा, क्योंकि इसमें कोई अंतर नहीं है। हालांकि मैं इसके साथ रह रहा हूं क्योंकि मैं कभी भी उस स्थान से नीचे नहीं गया।

#!/bin/bash                                                                    

# history_of_file                                                              
#                                                                              
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802          
#   Outputs the full history of a given file as a sequence of                  
#   logentry/diff pairs.  The first revision of the file is emitted as         
#   full text since there's not previous version to compare it to.             
#                                                                              
# Dlink                                                                        
#   Made to work in reverse order                                              

function history_of_file() {
    url=$1 # current url of file                                               
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
        while read r
    do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
    done
    }
}

history_of_file $1

0

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

svn blame -v <filename>

अपनी खोज को आसान बनाने के लिए, आप एक फ़ाइल में आउटपुट लिख सकते हैं और जिस चीज़ की तलाश कर रहे हैं उसके लिए grep कर सकते हैं।

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