2010-04-06 14 views
7

मैंने अपने वेब एप्लिकेशन के लिए एक बिल्ड सिस्टम बनाया है जो फ़ाइल के संशोधन संख्या (क्लाइंट कैशिंग में सुधार करने के लिए) को शामिल करने के लिए सभी संसाधन यूआरएल को फिर से लिख रहा है। आज के रूप में मैं इस आदेश चल रहा हूँ प्रत्येक फ़ाइल संशोधन संख्या पाने के लिए:Mercurial भंडार में प्रत्येक फ़ाइल के लिए नवीनतम संशोधन संख्या की सूची कैसे प्राप्त करें?

hg log --template '{rev}\n' path-to-file 

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

+1

आप उत्तर पसंद नहीं करेंगे, लेकिन संक्षेप में यह "svn सोच" है। सभी फ़ाइलों के लिए नवीनतम संशोधन संख्या समान है, और यह 'टिप' है। सिर्फ इसलिए कि एक संशोधन में एक फ़ाइल को बदला नहीं गया था इसका मतलब यह नहीं है कि इसमें संशोधन संख्या नहीं है। यह pedantic लगता है, लेकिन नहीं। यह डीवीसीएस के काम के तरीके के बारे में मौलिक अवधारणाओं में से एक है। एसवीएन (और पूर्ववर्ती) ने आपको चेकआउट में विभिन्न संशोधनों पर फाइलें रखने की अनुमति दी। Mercurial विशेष रूप से यह संभव नहीं बनाता है। 'एचजी माता-पिता किसी कारण के लिए फ़ाइल विकल्प नहीं लेते हैं। मैं आपको पुनर्विचार करने का आग्रह करता हूं कि आपको क्यों लगता है कि आपको इस मूल्य की आवश्यकता है। –

+0

हां और नहीं। उदाहरण के लिए, हमें रेपो के किसी दिए गए हिस्से के संशोधन पर निर्माण को ट्रिगर करने के लिए ऐसा कुछ चाहिए। लेकिन मैं अभी भी आपके बिंदु को समझ सकता हूं। –

+0

@ Ry4an जैसा कि मैंने संशोधन संख्या के नीचे उल्लेख किया है, काफी अच्छी तरह से काम करता है क्योंकि यह हमेशा बिल्ड सर्वर द्वारा उपयोग किया जाता है। कुछ समय के लिए मैंने प्रत्येक फ़ाइल प्रति तैनाती के लिए उत्पन्न एक यादृच्छिक संख्या का उपयोग किया, लेकिन इस तरह क्लाइंट कैश फ़ाइल परिवर्तनों को ट्रैक करने के लिए अतिरिक्त डेटाबेस की आवश्यकता के बिना एकाधिक परिनियोजन चक्रों के लिए मान्य रहता है - यही कारण है कि हमारे पास संस्करण नियंत्रण प्रणाली है पहली जगह सही है? :) – Kimble

उत्तर

2

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

hg grep --all '.' | perl -na -F: -e 'next unless ($F[2] eq "+"); print "$F[0] $F[1]\n" unless ($prev eq $F[0]); $prev = $F[0]' 

उदाहरण:

that 3 
file 1 
+0

धन्यवाद! भले ही यह * * सबसे कुशल समाधान नहीं है, यह शायद मेरे वर्तमान दृष्टिकोण से बहुत तेज़ है। मैं हैश की बजाय संशोधन संख्या का उपयोग कर रहा हूं क्योंकि यह थोड़ा अच्छा दिखता है और निर्माण हमेशा उसी मशीन पर होता है। – Kimble

+0

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

2

पाइथन में ऐसे कमांड को कोड करना, या तो एचजी एनोटेट को पार्सिंग या एक मेरकोरियल एक्सटेंशन के रूप में बहुत मुश्किल नहीं होना चाहिए। Mercurial मेलिंग-सूची पर निम्नलिखित discussion एक उचित समाधान प्रदान करता है, हालांकि मैंने इसे आजमाया नहीं है।

+0

मुझे मेलिंग सूची प्रविष्टि मिली, लेकिन मैं इसे करने के लिए बस एक Mercurial प्लगइन का प्रबंधन और वितरण नहीं करता हूं। – Kimble

+0

एक Mercurial एक्सटेंशन किसी भी तरह से एक पायथन लिपि से अधिक नहीं है :) –

+0

Mercurial एक्सटेंशन (कोड की 30 से कम लाइनों) के लिए +1 मैंने संशोधन/शाखा स्वीकार करने के लिए उल्लिखित विस्तार में सुधार किया। https://gist.github.com/2921583 –

2

एक एचजी डिबग आदेश नहीं है "एचजी debugdata -m REV "जो आपकी मदद कर सकता है। नीचे यह है कि यह कैसे काम करता है:

  1. मैं क्रमशः 0/1/2/में परिवर्तनों में 3 फ़ाइलें a.txt/b.txt/c.txt प्रतिबद्ध करता हूं। और मैं rev 3 में a.txt को संशोधित करता हूं। डीएजी इस तरह दिखता है:

------- 0 -------> 1 --------> 2 - ------> 3

a.txt b.txt c.txt a.txt

So the newest rev for a/b/c should be 3/1/2; 
  1. उसके बाद, लॉग रिकॉर्ड कर रहे हैं:

    एचजी लॉग -q

    3:31308f74291a 
        2:8d438b01dfd4 
        1:fcc0f041df56 
        0:c53934933136 
    
  2. a.txt दो संस्करणों, जो क्रमशः 0 और 3 ChangeSet से जुड़ा हुआ है है। A.txt के प्रत्येक संस्करण के लिए, Mercurial इसके लिए एक अद्वितीय हैश (नोडिड) उत्पन्न करेगा। ये नोडिड केवल a.txt से संबंधित हैं, और परिवर्तन हैश से अलग हैं। हम एक और डिबग आदेश का उपयोग कर सकते हैं कि उन संस्करण हैं देखने के लिए:

    ~/काम/एचजी/एक/.hg/स्टोर/डेटा $ एचजी debugindex a.txt.i

rev  offset length base linkrev nodeid    p1   p2 

0   0  3  0  0  b789fdd96dc2 000000000000 000000000000 
1   3  6  1  3  a9ecbd92f818 b789fdd96dc2 000000000000 

हम इन दो "nodeid" देख सकते हैं (b789fdd96dc2/a9ecbd92f818) क्रमशः संस्करण (linkrev) 0/3 changeSet से मेल खाती है। चूंकि इन नोडिड को फाइल सामग्री और मूल जानकारी (पी 1/पी 2) के आधार पर धोया जाता है, इसलिए वे भंडारक अर्थ में "अद्वितीय" होते हैं। तो "b789fdd96dc2" पहचानें।txt @ version-0, और a9ecbd92f818 [email protected] की पहचान करें।

  1. अंत में, देखते हैं कि "hg debugdata -m REV" कैसे काम करता है।

यह आदेश संस्करण आरईवी का "प्रकट" सूचीबद्ध करता है। एक मेनिफेस्ट एक विशिष्ट स्नैपशॉट है जो सभी फाइल @ संस्करण के लिए है जो विशिष्ट परिवर्तन आरईवी में मौजूद है। देखते हैं कि क्या प्रकट संस्करण 3 पर है दो:

~/काम/एचजी/एक $ एचजी debugdata मी 3

a.txt^@a9ecbd92f8182efd8eeb5396468fd70884650395 b.txt^@ 1e88685f5ddec574a34c70af492f95b6debc8741 c.txt^@149da44f2a4e14f488b7bd4157945a9837408c00

a.txt के लिए, आप अपने nodeid देख सकते हैं "a9ecbd92f8182efd8eeb5396468fd70884650395" है, जो कम वी के लिए एक मैच है चरण 3 पर उल्लिखित ersion nodeid इस तरह के नोडिड को आपके "पुनः लिखने वाले यूआरएल" को अच्छी तरह से सेवा देना चाहिए।

अब आपके पास पाठ का नाम और उनका नोडिड संशोधन 3 पर है। यह केवल आपके द्वारा जेनरेट करने के लिए एक डीबग कमांड लेता है। मुझे लगता है कि यह एक बेहतर समाधान है।

आप डिबग में रुचि रखते हैं आदेशों तेज प्रदान करता है, ऐसा करते हैं:

एचजी debugcomplete डिबग (सूची सभी डिबग आज्ञाओं)

एचजी मदद debugdata

एचजी मदद debugindex


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