2010-03-10 11 views
7

मुझे निम्नलिखित समस्या है जो अन्य लोगों को सामना करना पड़ा होगा। मैं एक कोड बेस पर काम कर रहा हूं जो दो अलग-अलग प्लेटफार्मों पर चलता है। अधिकांश कोड प्लेटफ़ॉर्म के बीच साझा किए जाते हैं, लेकिन कोड के कुछ हिस्सों को किसी विशेष प्लेटफॉर्म के लिए अनुकूलित किया जाता है। तो, फ़ाइल foo.cpp में फ़ंक्शन foo() का एक सामान्य कार्यान्वयन हो सकता है और फ़ाइल foo_A.cpp में प्लेटफ़ॉर्म ए के लिए अनुकूलित कार्यान्वयन हो सकता है।क्या सबवर्सन में दो फाइलों को "उलझन" करने का कोई तरीका है?

बेशक, कभी-कभी ऐसा होता है कि एक डेवलपर foo.cpp संशोधित करता है और उन्हें सिंक में रखने के लिए foo_A.cpp में एक समान परिवर्तन करने के लिए भूल जाता है। इससे बहुत अप्रिय बग की ओर जाता है, जो ट्रैक करना मुश्किल होता है।

अंत में, मेरा प्रश्न है: क्या सबवर्सन में दो या दो से अधिक फ़ाइलों को "उलझाने" का कोई तरीका है? क्या यह संभव है जब कोई भी foo.cpp में परिवर्तन करता है ताकि svn को चेतावनी जारी हो, foo_A.cpp अपडेट करने के लिए अनुस्मारक?

+3

फ़ंक्शंस अलग-अलग फ़ाइलों में क्या कारण है? मैं उन्हें एक फ़ाइल में #ifdef के साथ दूसरे पर एक समारोह शामिल करने के लिए होगा। यह सीधे समस्या को हल नहीं करता है, लेकिन यह कार्यों को एक साथ बहुत करीब रखता है। – Robert

+1

यह ऐसा कुछ नहीं है जिसे वास्तव में वीसीएस द्वारा संभाला जाना चाहिए। इसके बजाए, यह आपकी संपादन प्रक्रिया है जिसे किसी भी तरह दो फाइलों को सिंक में रखना चाहिए। –

+1

@Neil, कैसे? असल में, आपको याद रखना होगा कि हर बार जब आप foo.cpp को संशोधित करते हैं, तो आपको foo_A.cpp को संशोधित करने की आवश्यकता हो सकती है। और यदि आपके पास 500 फाइलें हैं, जिनमें से 20 में एक अनुकूलित समकक्ष है, तो इसे भूलने की संभावना बहुत अधिक है। उस तथ्य को जोड़ें कि अनुकूलित संस्करण एक अलग व्यक्ति द्वारा लिखा गया है। VCS का उपयोग करके जांच करने और आपको चेतावनी देने के लिए यदि उन 20 फ़ाइलों में से एक संशोधित है तो उचित लगता है। – Dima

उत्तर

7

आप pre-commit hook लिख सकते हैं जो यह सुनिश्चित करने के लिए जांच करता है कि foo.cpp और foo_A.cpp दोनों मौजूद हैं जब उनमें से कोई भी प्रतिबद्ध है।

यह या तो केवल एक चेतावनी संदेश प्रस्तुत कर सकता है और जारी रख सकता है, या असल में एक त्रुटि लौटकर प्रतिबद्धता में विफल हो सकता है।

3

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

यह आमतौर पर एक बुरा विचार है। अपनी परियोजनाओं का पुनर्गठन ताकि आप सभी एक ही फाइल साझा कर सकें आमतौर पर एक बेहतर समाधान है।

+0

मैं नहीं चाहता कि svn स्वचालित रूप से अन्य फ़ाइल को अपडेट करे। यह वास्तव में एक बुरा विचार होगा। आदर्श रूप में, मैं चाहता हूं कि यह मुझे एक संवाद बॉक्स/प्रॉम्प्ट दे जो कहता है "आपने foo.cpp को संशोधित किया है, लेकिन foo_A.cpp नहीं। क्या आप वाकई ठीक हैं? आपको वास्तव में जांच करनी चाहिए, क्योंकि अब foo.cpp और foo_A.cpp अलग-अलग चीजें कर सकते हैं। " और मैं इसे प्रतिबद्ध करना चाहता हूं, अगर मैं नहीं कहता कि यह ठीक है। एक ही फ़ाइल में विभिन्न प्लेटफार्मों के लिए कोड चिपकाना एक बुरा विचार है, आईएमएचओ। अलग-अलग फाइलों में प्लेटफ़ॉर्म-विशिष्ट कोड होना बेहतर है और बिल्ड कॉन्फ़िगरेशन स्तर पर उनके साथ सौदा करना बेहतर है। – Dima

0

आप उस फ़ाइल के खिलाफ यूनिट परीक्षण भी कर सकते हैं, निरंतर एकीकरण द्वारा दोनों प्लेटफ़ॉर्म पर चल सकते हैं - फिर केवल एक प्लेटफ़ॉर्म को तोड़ने वाले परिवर्तनों का पता लगाया जा सकता है। कम से कम यह सत्यापित करेगा कि दोनों कार्यान्वयन संकलन के दौरान एक ही इंटरफ़ेस का पर्दाफाश करते हैं।

+0

यह वास्तव में इंटरफ़ेस तोड़ने का सवाल नहीं है। मैं सामान्य कार्यान्वयन में किसी भी तरह एल्गोरिदम को ट्विक कर सकता हूं, इंटरफेस को बिल्कुल वही रखता हूं, और फिर अनुकूलित संस्करण को अपडेट करना भूल जाता हूं। वास्तव में, यह वही हुआ जो हुआ। :( – Dima

1

चूंकि आप संकलित भाषा का उपयोग कर रहे हैं, तो क्या आपने केवल एक नया नया फ़ंक्शन लिखने के बजाय ऑप्टिमाइज़ेशन के कार्यों में #ifdef (प्लेटफार्म को परिभाषित करने वाले झंडे की जांच) लिखा है?

+1

बीटीडब्ल्यू, मुझे पता है कि यह svn के बारे में अपने प्रश्न का उत्तर नहीं देता है। मैं सिर्फ सर्वोत्तम प्रथाओं के लिए कह रहा था। मुझे उसकी स्थिति पता नहीं है, इसलिए यह एक बेहतर समाधान नहीं हो सकता है, लेकिन सिर्फ यह देखना चाहता था कि वह इसे – Seaux

+0

#ifdefs को अक्सर C++ दुनिया में फेंक दिया गया है। प्रीप्रोसेसर स्तर की तुलना में बिल्ड कॉन्फ़िगरेशन में इन समस्याओं को हल करना बेहतर है। स्कॉट मेयर्स द्वारा "प्रभावी सी ++" की जांच करें। इसके अलावा, ifdefs के साथ भी यह अभी भी बहुत है कोड के दूसरे संस्करण को अपडेट करना भूलना आसान है। – Dima

+1

गोटो, मैं ज्यादातर लिनक्स-आधारित सी दुनिया से आया हूं और सी ++ के साथ ज्यादा अनुभव नहीं है (शैक्षणिक रूप से)। बस देखने के लिए विचार को टॉस करना चाहता था अगर यह मदद की। जानकारी के लिए धन्यवाद! – Seaux

2

यदि आप प्रतिबद्धता के हिस्से के रूप में foo.c को संशोधित किया गया है, तो आप प्रतिबद्धता को अस्वीकार करने के लिए pre-commit hook का उपयोग कर सकते हैं लेकिन foo_A.c नहीं है। आपकी परियोजना में कितनी फाइलें हैं, इस पर निर्भर करता है कि फ़ाइलों को स्पष्ट रूप से हुक स्क्रिप्ट में सूचीबद्ध करके प्रबंधित करना मुश्किल हो सकता है।

यदि आपके पास कुछ सुसंगत फ़ाइल-नामकरण सम्मेलन हैं, तो आप स्क्रिप्ट में कुछ बुद्धिमान पैटर्न-मिलान तर्क डाल सकते हैं। (उदाहरण के लिए यदि आप जानते हैं कि अनुकूलित फ़ाइलों के नाम हमेशा "_A" में समाप्त होते हैं, तो आप जांच को थोड़ा आसान कर सकते हैं।)

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

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

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

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