2010-08-09 12 views
6

'svn log' का लॉग दिखाता है: 1) जिनकी सामग्री बदल गई है और/OR 2) जिनकी संपत्तियां बदली गई हैं।'SVN लॉग' बनाने के लिए संपत्ति परिवर्तनों को अनदेखा?

वहाँ जो मामले के लिए 1 लागू होता है केवल फाइलों को दिखाने के लिए कोई तरीका है? हो सकता है कि SVN log in the Subversion manual

उन्हें बाहर फ़िल्टर कर बाद में, उदाहरण के लिए:

+0

संभावित डुप्लिकेट [क्या एसवीएन डीआईएफएफ कमांड के लिए मेटाडाटा बहिष्करण फ़िल्टर है?] (Http://stackoverflow.com/questions/402522/is-there-a-metadata-exclusion-filter-for-the-svn -डिफ-कमांड) –

+0

@Pekka मुझे कोई समाधान नहीं मिला जो यहां लागू है। समस्याएं समान हो सकती हैं, लेकिन डुप्लीकेट नहीं हैं। –

+0

@zr मुझे खेद है। मैंने दूसरे प्रश्न के भिन्न पहलू को नजरअंदाज कर दिया। हालांकि, क्या सरल जीआरपी निर्माण सही दिशा में नहीं जाता है? –

उत्तर

4

'SVN लॉग' का लॉग दिखाता धन्यवाद,
जाकारी।

जैसा कि आप जानते हैं, svn लॉग का आउटपुट फ़ाइलों के बजाए लॉग संदेश संदेशों द्वारा व्यवस्थित किया जाता है। यदि आप वर्बोज़ मोड (-v) का उपयोग करते हैं, तो यह प्रत्येक लॉग एंट्री से जुड़े फाइल ("पथ") दिखाएगा। हालांकि उन रास्तों में से कुछ का अनुरोध लक्ष्य के बाहर (: अपने वर्तमान निर्देशिका डिफ़ॉल्ट) हो सकता है। क्या आप चाहते हैं कि परिणाम उन बाहरी पथों को भी शामिल करें? मैं अंकित मूल्य पर अपने प्रश्न लेने लगता है, तो आप सिर्फ छानने के लिए पूछ रहे हैं, तो हाँ आप उन बाहरी रास्तों चाहेगा अगर वे फ़ाइलों के लिए एक सामग्री परिवर्तन का प्रतिनिधित्व करते हैं।

यहाँ एक समाधान है। यह धीमी हो सकती है, लेकिन मैं इसे परीक्षण किया है और यह विंडोज 7 पर cygwin में काम करता है (याद रखें,! यदि आवश्यक हो तो सुनिश्चित करें कि आपके स्क्रिप्ट Unixy लाइन अंत कर dos2unix के साथ)

यह वास्तव में केवल एक ही लंबी लाइन है, एक बाहरी sed स्क्रिप्ट (जो एक वास्तविक हैकर कमांड लाइन पर डाल सकता है लेकिन जीवन छोटा है कमांड लाइन से बचने के साथ खिलवाड़ करने के लिए) को छोड़कर: यहाँ

#!/bin/sh 

# These paths are set up for cygwin 
SED=/bin/sed 
SORT=/bin/sort 
UNIQ=/bin/uniq 
XARGS=/bin/xargs 
GREP=/bin/grep 
SVN=svn 

# Add desired log options here 
LOG_OPTIONS=-v 
SINCE_REV=10800 
SED_SCRIPT=/cygdrive/c/temp/get-paths.sed 
# Make sure you edit the sed script referenced above 
# to set the base URL of your repository. 

# 1) generate the list of log messages, including affected paths (svn log -v) 
# 2) process out those paths (sed) 
# 3) eliminate duplicates (sort | uniq) 
# 4) get the change history for each of those paths (svn diff) 
# 5) filter out the ones that involve only property changes (sed) 
# 6) eliminate duplicates again (sort | uniq) 
$SVN log $LOG_OPTIONS | $SED -n -f $SED_SCRIPT | $SORT | $UNIQ \ 
| $XARGS -n20 -I PATHS $SVN diff -r $SINCE_REV --summarize PATHS 2> error.log \ 
| $SED -n 's/^[^ ].... *//p' | $SORT | $UNIQ 

बाहरी sed स्क्रिप्ट है। अपने भंडार के लिए सही आधार URL पर svn भंडार आधार URL को बदलना सुनिश्चित करें। अर्थात। svn URL का प्रारंभिक भाग जो svn log -v द्वारा आउटपुट नहीं है।

# sed script to output all lines between 
# /^Changed paths:$/ and /^$/, exclusive. 
# Also removes first 5 columns (status) and replaces them with svn repository base url. 

/^Changed paths:$/,/^$/ { 
    /^Changed paths:$/b 
    /^$/b 
    s|^.....|https://svn.myrepo.org/prefix| 
    s/ (from .*)$// 
    p 
} 

स्क्रिप्ट उत्पादन कुछ त्रुटि संदेश error.log, मुख्य रूप से "पथ नहीं मिला" होगा, जो मेरा मानना ​​है कि फ़ाइलों को भंडार में मौजूद हुआ करता था लेकिन स्थानांतरित कर दिया गया है (नाम बदला) या हटाई के लिए है।

क्या यह आपकी आवश्यकताओं को पूरा करता है?

this page पर माइकल ऑगस्टिन को क्रेडिट-केवल परिवर्तनों को हटाने के लिए svn diff के आउटपुट को grepping के बारे में विचारों के लिए क्रेडिट।

पीएस This other page एक ही प्रश्न पूछने लगता है, लेकिन वहां कोई पूरा जवाब नहीं है।

पी.पी.एस. पाइपलाइन के अंत में एक अतिरिक्त | sort | uniq जोड़ने के लिए उपर्युक्त बैश स्क्रिप्ट संपादित करें, क्योंकि मैंने वहां डुप्लीकेट्स को बाहर देखा है। हालांकि मुझे नहीं लगता कि वे क्यों होंगे।

+0

पीएस देखें मैं एसओ में नया हूं, और मुझे बक्षीस में दिलचस्पी है, इसलिए यदि आप सोचते हैं कि यह आपके प्रश्न का उत्तर देता है, तो कृपया फ़ॉलो करें। और अगर कोई और सोचता है कि यह सवाल अच्छी तरह से जवाब देता है, तो कृपया इसे अगले कुछ घंटों में वोट दें। :-) – LarsH

+0

+1! @ लार्सएच: यह एसओ की ग़लत चीजों में से एक है: बक्षीस प्रणाली। विचार अच्छा है, और कई ने ऑटो-डिमांड सुविधा की शिकायत की है, लेकिन यह अभी भी वहां है। मैंने अक्सर अपने उत्तरों को अनदेखा कर देखा है, या बक्षीस अवधि समाप्त होने के बाद उत्तर के रूप में चेक किया है। और देखें, यहां भी, उछाल के लिए उछाल के लिए बहुत देर हो चुकी है ... (पीएस: meta.stackoverflow.com पर कुछ चर्चाएं देखें) – Abel

+0

@ अबेल, हाँ ... मैंने उस पर थोड़ा सा समय बिताया , और समय सीमा से पहले कई घंटे पोस्ट किया। इसके अलावा @zr ऑनलाइन था। लेकिन शायद एक और सवाल के साथ व्यस्त है। तो इसे वोट देने के लिए धन्यवाद। मैं प्रतिनिधि के लिए अब एक उचित दहलीज पर हूं, इसलिए बकाया खोना उतना महत्वपूर्ण नहीं है। – LarsH

2

यह ऐसा प्रतीत नहीं होता एक खोल स्क्रिप्ट का उपयोग कर? आप किस प्रणाली पर हैं?

+0

हां। मेरा मानना ​​है कि इसके लिए कुछ पोस्ट प्रोसेसिंग स्क्रिप्ट लिखना आवश्यक है। मैं उम्मीद कर रहा था कि कोई पहिया को फिर से शुरू करने के बजाय मौजूदा समाधान साझा करने के इच्छुक होगा। –

+0

@zr यह करना बेहद मुश्किल है जब आप उस ऑपरेटिंग सिस्टम को भी प्रकट नहीं करते हैं जिस पर आपको काम करने की आवश्यकता है। आपको वह जानकारी जोड़नी चाहिए। –

+0

मैं विंडोज और लिनक्स दोनों का उपयोग करता हूं। विंडोज़ पर मेरे पास सिग्विन मेरे खोल में अंतर है, इसलिए एक यूनिक्स-स्टाइल समाधान दोनों प्लेटफार्मों पर काम करना चाहिए। –

1

यहां तक ​​कि आसपास खोज करने से पहले मैं निष्कर्ष पर पहुंचे कि इस लॉग में प्रत्येक संशोधन लेने और `SVN diff 'के लिए इसे पारित देखने के लिए बस क्या संशोधन में बदल की आवश्यकता होगी। तब मुझे यह अन्य एसओ सवाल मिला: how to detect modified properties using SVN log

svnlog.py है जिसमें लेखकों और पथों के लिए फ़िल्टरिंग विकल्प शामिल हैं, लेकिन इसमें कोई अंतर एकीकरण शामिल नहीं है। आप इसे हैक करने में सक्षम हो सकते हैं।

मुझे आशा है कि इस मदद करता है। 1) फ़ाइलें जिनकी सामग्री बदल गया है और/या 2) फ़ाइलें जिसका गुण बदल गया है:

आप

0

यहाँ गुण परिवर्तन अनदेखी, केवल वास्तविक फ़ाइल परिवर्तन के लिए लॉग दिखाने के लिए एक तरीका है:

#!/bin/sh 

for i in $(svn log --xml --with-no-revprops | xml sel -t -m "/log/logentry" -v "@revision" -o " "); do 
    j=$(svn diff -c $i --summarize | grep -v "^ ") 
    if [ -n "$j" ]; then 
     svn log -c $i 
    fi 
done 

ऊपर xmlstarlet की आवश्यकता है स्थापित होने के लिए।

1

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

प्रत्येक अन्य सुझावों में कुछ ऐसा आवश्यक था जिसे मैंने इंस्टॉल नहीं किया था, इसलिए मैंने एक संस्करण बनाया जो मेरी ज़रूरतों के लिए अच्छी तरह से काम करता है (एक फ़ाइल के बारे में पूछताछ) और इसके लिए केवल sh + awk की आवश्यकता होती है। "Svn-log-contents.sh" में निम्नलिखित रखो:

#!/bin/sh 

while [ ! -z "$1" ]; do 
    file="$1" 
    base=`basename "$file"` 
    echo "$base ($file)" 
    shift 
    svn log -v $file | \ 
     awk "/^r([1-9]+)/ { r=\$1 } /^ *[MAD] .*$base$/ { \ 
      system(\"svn log -l 1 -r \" r \" $file\") }" 
done 

यह आदेश पर 'chmod एक + x svn-log-contents.sh', फ़ाइल नाम (रों) तो आपूर्ति का उपयोग कर निष्पादन योग्य बनाने के रेखा:

./svn-log-contents.sh file.txt 

पहले नियमित अभिव्यक्ति (/^आर [1-9] /) एक चर आर में एक संशोधन संख्या पकड़ लेता है। अगली नियमित अभिव्यक्ति ('/^* [एमएडी] ... /') तब तभी ट्रिगर होती है जब फ़ाइल को एक महत्वपूर्ण तरीके से संशोधित किया गया है, उस समय यह उस संशोधन पर 'svn log' चलाएगा। मैं एक बहुत ही नौसिखिया हूँ, इसलिए सुझावों का स्वागत है।

संबंधित मुद्दे