2009-03-17 8 views
12

मैं एक एसवीएन भंडार के साथ इंटरफेस करने के लिए गिट का उपयोग करता हूं। मेरे पास काम करने वाली विभिन्न परियोजनाओं के लिए कई गिट शाखाएं हैं Iगिट और सी ++ वर्कफ़्लो, ऑब्जेक्ट को कैसे प्रबंधित करें और फ़ाइलों को संग्रहित करें?

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

एकाधिक गिट भंडार बनाने के बिना इसे संभालने का कोई तरीका है ?

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

+0

आप अलग अलग निर्देशिका के लिए विभिन्न शाखाओं चेकआउट चाहिए जोड़ने कर रहे हैं, या मैं अपने हो रही है सवाल गलत है? – schnaader

+0

आप स्रोत नियंत्रण में निष्पादन योग्य और बाइनरी क्यों चाहते हैं? – n0rd

+0

जैसा कि किसी उत्तर में इंगित किया गया है, एक अच्छा समाधान एक अलग फ़ोल्डर में बनाना है जहां स्रोत हैं। लेकिन स्थानीय गिट भंडार क्लोनिंग वास्तव में तेज़ है, इसलिए यह बुरा नहीं हो सकता है। – Ismael

उत्तर

9

आप जो चाहते हैं वह सिर्फ पूर्ण शाखा है, न केवल शाखा ... जो आमतौर पर संस्करण नियंत्रण उपकरण के दायरे से बाहर है। ऐसा करने का सबसे अच्छा तरीका एकाधिक भंडारों का उपयोग करना है।

हालांकि इसकी अक्षमता के बारे में चिंता न करें ... अपना दूसरा भंडार पहले का क्लोन बनाएं। डिस्क पर कई प्रतियां होने से बचने के लिए गिट स्वचालित रूप से लिंक का उपयोग करेगा।

यहाँ आप आप चाहते हैं

जब से तुम अलग obj निर्देशिका है चाहते देने के लिए एक हैक है, तो आप आधार स्थान कुछ इस तरह का उपयोग कर गतिशील बनाने के लिए अपने Makefiles को संशोधित कर सकते हैं:

OBJBASE = `git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1\//'` 
OBJDIR = "$(OBJBASE).obj" 
# branch master: OBJBASE == "master/", OBJDIR == "master/.obj" 
# non-git checkout: OBJBASE == "", OBJDIR == ".obj" 

कि लेकिन आपकी शाखा का नाम OBJBASE में होगा, जिसका उपयोग आप अपने वास्तविक objdir स्थान को बनाने के लिए कर सकते हैं। मैं इसे आपके पर्यावरण में फिट करने के लिए संशोधित करने के लिए छोड़ दूंगा और इसे अपने मेकफ़ाइल के गैर-गिट उपयोगकर्ताओं के अनुकूल बना दूंगा।

1

उन फ़ाइलों को गिट या सबवर्जन द्वारा ट्रैक नहीं किया जाता है, इसलिए वे इस धारणा पर अकेले रह गए हैं कि वे आपके लिए कुछ उपयोग हैं।

मैं बस विभिन्न निर्देशिकाओं में अपने चेकआउट करता हूं। मुझे सफाई करने की परेशानी बचाता है।

6

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

+0

क्या यह मानक अभ्यास है? वर्तमान में हमारे पेड़ को ओबीजे और lib निर्देशिकाओं के साथ प्रत्येक मॉड्यूल के लिए अलग-अलग स्रोत निर्देशिकाओं में विभाजित किया गया है। इस पर अलग-अलग तरीके से (मानक तरीके से) कैसे कोई संकेतक? –

+1

यह जहां पेड़ में वे इतने लंबे समय के रूप में कर रहे हैं सामग्री SVN की तरह तंत्र द्वारा नियंत्रण से बाहर रखा गया कोई फ़र्क नहीं पड़ता: उपेक्षा –

+2

यह वस्तु फ़ाइलों उसकी चेकआउट से मेल नहीं होगा। वह शाखा परिवर्तन पर 'साफ करने' से बचने की कोशिश कर रहा है। –

3

आप <output>\branchName\... में सभी निजी अस्थायी फ़ाइलों (.class और इतने पर) उत्पन्न करने के लिए अपना आईडीई कंपाइलर सेट कर सकते हैं।

शाखा द्वारा अपनी संकलन सेटिंग शाखा कॉन्फ़िगर करके, आप आउटपुट निर्देशिका पथ में शाखा का नाम पंजीकृत कर सकते हैं।

इस तरह, भले ही निजी फाइलें git checkout पर हों, भले ही नई शाखा पर आपकी परियोजना जाने के लिए तैयार हो।

3

git वितरण की निर्देशिका में git-new-workdir नामक एक स्क्रिप्ट है जो आपको अपनी रिपॉजिटरी क्लोन किए बिना विभिन्न निर्देशिकाओं में गुणक शाखाओं को चेकआउट करने की अनुमति देती है।

0

एक साफ आवश्यक नहीं होना चाहिए क्योंकि फ़ाइलों को विभिन्न शाखाओं के बीच अलग हैं वास्तविक तिथि के साथ की जाँच की हो !!!

इसका मतलब यह है कि यदि आपके Makefile सही है, केवल उन वस्तु फ़ाइलें, libs और निष्पादनयोग्य फिर से संकलित कर रहे हैं कि वास्तव में चेकआउट की वजह से बदल दिया है। पहली जगह मेकफ़ाइल वास्तव में यही कारण है।

अपवाद अगर आप विभिन्न शाखाओं में संकलक विकल्प या यहाँ तक कि compilers स्विच करने की आवश्यकता है। उस मामले में शायद गिट-न्यू-वर्कडीर सबसे अच्छा समाधान है।

5

ही रेपो के कई checkouts रखने के लिए, आप Git --work-पेड़ का उपयोग कर सकते हैं। उदाहरण के लिए,

mkdir $BRANCH.d 
GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH 
0

तो संकलित निष्पादनयोग्य फ़ाइलें जो
में जाँच किया गया है तो git छिपाने की जगह समस्या का हल।

[compile] 
git stash save "first branch" 
git checkout other_branch 
[Fiddle with your code] 
[compile] 
git stash save "second branch" 
git checkout first_branch 
git stash apply [whatever index your "first branch" stash has] 
# alternatively git stash pop [whatever index...] 

तो संकलित निष्पादनयोग्य फ़ाइलें जो नहीं किया है और
में जांच नहीं की जाएगी तो बस उन्हें .gitignore को

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