2012-03-05 14 views
5

कुछ अस्पष्ट (लेकिन मान्य) कारणों के लिए मुझे यह पता लगाना होगा कि फ़ाइल को हमारे भंडार में कभी संस्करणित किया गया है या नहीं।मुझे कैसे पता चलेगा कि एक svn-repo में फ़ाइल कभी मौजूद है या नहीं?

मैं केवल युक्त निर्देशिका के लिए लॉग हो रही है और फिर हटा प्रविष्टियों के लिए उसे पार्स का एक राउंडअबाउट रास्ता मिल गया है:

svn log -v a/b/|grep " D .*a/b/c.xml" 

यह काम करता है, लेकिन लगता है "अशुद्ध" और कुछ हद तक कमजोर।

+0

svn log -q -v | grep filename | wc -l –

उत्तर

4

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

तो अपने प्रस्तावित समाधान के साथ शुरू:

svn log -v a/b/ | grep " D .*a/b/c.xml" 

मैं पहली बार -q विकल्प जोड़ना होगा, जो उत्पादन पर कटौती है कि आप बस वैसे भी निकाल रहे हैं:

svn log -v -q a/b/ | grep " D .*a/b/c.xml" 

और फिर मैं चाहेगा को जानने के लिए ऐसी फ़ाइल हटा दी गई थी, लेकिन जब हटा दिया गया था (यानी जिसमें संशोधन)। जब से तुम भी परोक्ष यूनिक्स/लिनक्स के लिए अपने वातावरण में योग्य, यहाँ awk के साथ एक समाधान (इस blog entry से रूपांतरित) है:

svn log -q -v a/b/ | awk ' 
    /^r[0-9]* \|/ { REVISION=$1; } 
    /D/ { print REVISION": "$0; } 
' | grep " D .*a/b/c.xml" 

कि svn log उत्पादन का स्वरूप की वजह से काम करता है जब –v पैरामीटर का उपयोग किया जाता है: यह उस संशोधन में सभी फाइलों के बाद एक संशोधन की रिपोर्ट करता है। यहाँ दिखा रहा है कि फ़ाइल Page.cs संशोधन 10506 में नष्ट कर दिया गया एक उदाहरण है:

r10506 | msorens | 2011-02-14 12:58:56 -0800 (Mon, 14 Feb 2011) | 1 line 
Changed paths: 
    A /Projects/Test/Common 
    A /Projects/Test/Common/Setup.cs 
    A /Projects/Test/Common/Utility.cs 
    D /Projects/Test/Page.cs 

इस प्रारूप में पार्स उत्पादन ऊपर awk आदेशों शीर्ष पंक्ति से संशोधन संख्या निकालने तो किसी भी फाइल के रूप में नष्ट ('डी चिह्नित "रेखाएं)। बस अपने काम के रूट पर लॉग विंडो खोलने

$(switch -Regex (svn log -q -v a/b) { 
    '^(r[0-9]*) \|' { $rev = $Matches[1] } 
    '^ D\s+(.*)' { "{0,-6} {1}" -f $rev, $Matches[1] } 
}) | Select-String "a/b/c.xml" 

लेकिन वहाँ TortoiseSVN के साथ एक आसान तरीका है ---: Windows के लिए, PowerShell स्विच बयान उपयोग करके एक ही शक्ति और awk के रूप में उपयोग में आसानी प्रदान करता है खोज बॉक्स में फ़ाइल नाम में कॉपी और टाइप करें। संशोधनों की सूची तुरंत जो भी आप टाइप करते हैं उसे फ़िल्टर करती है। यदि यह आउटपुट की एक से अधिक पंक्तियों को दिखाता है, तो नवीनतम (शीर्षतम) संशोधन हमेशा वह होगा जहां फ़ाइल हटा दी गई थी।

0

@Michael Sorens जवाब देने के लिए धन्यवाद, मैं इस काम कर

मेरे मामले में मैं जो जहां एक फ़ोल्डर ./assets/gfx

यहाँ से हटा फ़ाइलें बैश खोल के लिए कोड है देखने के लिए की जरूरत मिल गया एक एक लाइनर एक बार आप इनपुट सेटअप है, जहाँ प्रत्येक पंक्ति एक कमांड लाइन और 'mysearchstr' है में खोल

mysearchstr=assets/gfx/ 
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; }/D/ { print REVISION": "$0; }' | grep menu 

बस साझा करने के लिए कैसे मैं इस समाधान का आयोजन करना चाहता था में एक वर सेट है।यह मूल उत्तर का एक रिहाश है .. लेकिन शायद संक्षिप्त कोड ब्लॉक के लिए किसी के लिए उपयोग करने के लिए, प्रतिलिपि बनाने में आसान है, और दोहराता है कि वास्तविक समाधान उत्तर (हालांकि कोई इसे लागू करता है) वास्तव में सही है

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