2010-01-13 6 views
15

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

मुझे मिल सकता है निकटतम एनालॉग gitattributes है। filter= निर्देश है, लेकिन ऐसा लगता है कि गिट फिल्टर के साथ संवाद नहीं करता है जो फ़िल्टरिंग का फ़ाइल नाम है, जो $URL$ को पथ में बदलना आवश्यक होगा।

ident निर्देश भी है, जो $Id$ को ब्लॉब हैश में बदल देगा। यह उपयोग योग्य हो सकता है अगर कोई इसे वापस पथनाम में मैप कर सकता है, लेकिन मेरा गिट-फ़ू पर्याप्त मजबूत नहीं है।

कोई सुझाव?

कार्यप्रवाह इस प्रकार है:

  1. व्यवस्थापक VCS रेपो में परिवर्तन करता है
  2. व्यवस्थापक एक केंद्रीय स्थान है कि बाहर रेपो
  3. व्यवस्थापक मेजबान cfengine
  4. का उपयोग कर में परिवर्तन खींचती है की जाँच की है अद्यतन करता है
+0

जब आप कहते हैं कि पथ, यह मुख्य रूप एक शाखा या एक शाखा के भीतर वास्तविक पथ की पहचान करने के लिए इस्तेमाल किया जाता है? –

+0

मेरा मतलब फ़ाइल का पथनाम है। तो यदि कोई व्यवस्थापक फ़ाइल '/ etc/apache2/साइट-उपलब्ध/trac' फ़ाइल को देखता है, तो वह देखेगा कि वह उस फ़ाइल को VCS में 'https://eng.svn.pdaverticals.com/trunk/net के रूप में देख सकता है/http/apache2/साइटों/trac'। अन्यथा, उसे ढूंढना और उम्मीद है कि फ़ाइल नाम मिलान हो सकता है, जो ऐसा नहीं हो सकता है, क्योंकि कुछ फ़ाइलों को मेजबान को भेजे जाने पर अलग-अलग नाम मिलते हैं, और कुछ फाइलें अलग-अलग फ़ाइल टुकड़ों के समूह से बना होती हैं और नहीं वीसीएस में भी एक एनालॉग है। – Rudedog

उत्तर

6

जैसा कि "Does git have anything like svn propset svn:keywords or pre-/post-commit hooks?" में उल्लिखित है, गिट कीवर्ड विस्तार का समर्थन नहीं करता है।

"Dealing with SVN keyword expansion with git-sv" git config filter (जो बिल्कुल आप चाहते हैं) और/या gitattributes पर आधारित समाधान प्रदान करता है।


निकटतम उदाहरण है अगर फ़ाइल जानकारी विस्तार मैं यह अभी भी धब्बा/साफ दृष्टिकोण, with this git Hash filter के आधार पर पाया है, लेकिन स्वच्छ हिस्सा फ़ाइल से निकालता है, और कोई रास्ता पाया जा सकता है।

This thread वास्तव में इसे बाहर मंत्र (और साथ ही उल्लेख कुछ Git फू आदेश शामिल हो सकता है जो आप के लिए क्या देख रहे है, मैं उन्हें परीक्षण नहीं किया):

वैसे भी, धब्बा/साफ नहीं देता क्योंकि छोटे तकनीकी कमियों की समस्या का तत्काल समाधान:

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

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

AFAIR, धब्बा फिल्टर में जानकारी की कमी धब्बा/साफ तंत्र के इस विशेष उपयोग को हतोत्साहित करने जानबूझकर किया गया था। हालांकि, मुझे लगता है कि पीटर के उपयोग के मामले पर इसे पुनर्विचार किया जा सकता है: वेबसावर को तत्काल प्रकाशन के लिए "चेकआउट-केवल" कार्यक्षेत्र।
वैकल्पिक रूप से, इस उपयोग के मामले में रुचि रखने वाले किसी भी व्यक्ति को साइट-स्थानीय पैच के रूप में अतिरिक्त धुंध तर्क लागू कर सकते हैं।

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

+0

मैंने पहले ही उन दो लिंक को पढ़ और छूट दी है क्योंकि उनमें से कोई भी जो मैं ढूंढ रहा हूं वह नहीं करता है। मुझे गिटैट्रिब्यूट्स के बारे में भी पता है, जिसे मैंने सोचा था कि मैंने इस तथ्य से स्पष्ट किया है कि मैंने उन्हें अपनी पोस्ट में संदर्भित किया है। – Rudedog

2

एक पूरी तरह से अलग कोण से समस्या पर आ रहा है, अंत में मेजबान फाइलें अंत मेजबानों पर कैसे समाप्त होती हैं? मुझे लगता है कि आज इसे या तो सीधे जांच लिया गया है, या किसी अन्य होस्ट पर पहले से चेक आउट रिपोजिटरी से कॉपी किया गया है?

, यदि ऐसा है तो आप अपने प्रक्रिया को संशोधित कर सकता है ताकि फ़ाइलों को एक Git भंडार के लिए बाहर जाँच कर रहे हैं, और एक स्क्रिप्ट चेकआउट के बाद $URL$ या अन्य कीवर्ड विस्तार करता है। इस तरह आप जो भी विकल्प पसंद करते हैं, वही कर सकते हैं, और चेक-आउट रिपॉजिटरी में स्क्रिप्ट द्वारा क्या समझा जा सकता है, केवल सीमित हो सकता है।

+0

+1। उत्पादन पर्यावरण के बहुत करीब मुझे पता है: आप किसी अंतिम होस्ट पर कोई वीसीएस उपकरण नहीं चाहते हैं।एक मध्यवर्ती वातावरण अधिक सुरक्षित है। – VonC

+1

हमारे पास एक मास्टर एडमिन सर्वर है जिसमें वीसीएस का केवल-पढ़ने वाला चेकआउट है। मैंने पोस्ट-चेकआउट के संपादन करने के बारे में सोचा, लेकिन समस्या यह है कि गिट तब सोचता है कि सभी फाइलें संशोधित की गई हैं और बाद में गिट पुल विफल हो जाएगी। मैंने गिट-आर्काइव का उपयोग करके केंद्रीय स्टेजिंग क्षेत्र को रीफ्रेश करने के बारे में भी सोचा है, लेकिन यह फाइल टाइमस्टैम्प आदि में बदलाव के साथ सभी प्रकार की समस्याओं का कारण बन जाएगा। – Rudedog

+1

मैं मानता हूं कि यह इष्टतम नहीं है। यह ** गिट रीसेट - हार्ड के करीब कुछ कर कर ** काम कर सकता है; गिट खींचो; प्रतिस्थापन; तैनाती-फाइलें ', लेकिन अभी भी वह नहीं है जो आप खोज रहे हैं। :) –

1

हम अपने तैनाती में एक "कैनोलिक पथ" समाधान का उपयोग करते हैं (वे सभी आंतरिक, एफडब्ल्यूआईडब्ल्यू) हैं।

सभी सॉफ़्टवेयर उदा। /d/sw/xyz/a.c या डी: \ दप \ xyz \ a.c

तैनात फ़ाइलों के लिए सभी URL जैसे प्रतिबिंबित http: //host/d/sw/xyz/a.c

भंडार फ़ाइलों में यूआरएल "sw" से शुरू होते हैं उदा। Git: // githost/gitrepo/xyz/एसी

हम विन्यास में इन प्रामाणिक पथ (यह कभी बदलने की जरूरत है चाहिए) सांकेतिक शब्दों में बदलना है, और हम स्क्रिप्ट/एपीआई कि उत्पन्न/के लिए उड़ान भरने के किसी यूआरएल को संदर्भित है घटकों के बीच गतिशील लिंकिंग।

4

चूंकि आजकल %f विकल्प है, git-rcs-keywords जैसी स्क्रिप्ट कार्य कर सकती हैं।

यह पहले से ही this answer में उल्लिखित है।

gitattributes(5) manpage:

Sequence "%f" on the filter command line is replaced with 
the name of the file the filter is working on. A filter 
might use this in keyword substitution. For example: 

[filter "p4"] 
    clean = git-p4-filter --clean %f 
    smudge = git-p4-filter --smudge %f 
+0

अब, गिट फ़िल्टर को कुछ और जानकारी निकालने के लिए और भी गिट कमांड लॉन्च करना चाहिए (और हैश को वैसे भी निकालना संभव नहीं होगा) कि गिट पहले से ही था ... यह वास्तविक गतिशील चीजें हैं ... यह नहीं है बेहतर है कि पोस्ट-चाकआउट हुक :-( –