2011-06-09 16 views
10

विलय करने से फ़ाइलों को कैसे बाहर निकालना है मैं एक रिपोजिटरी में वेबसाइट की 2 परियोजनाओं को रखने की कोशिश कर रहा हूं। यह वेबसाइट मुख्य रूप से टेम्पलेट (एचटीएमएल, सीएसएस) फ़ाइलों और कुछ कॉन्फ़िगरेशन फ़ाइलों को छोड़कर समान होती हैं। मुख्य साइट (जो मेरा कहना है Supersite) शाखा मास्टर में है। दूसरी साइट शाखा माध्यमिकसाइट में है। हर बार, जब मैं मास्टर शाखा में कुछ नई सुविधा विकसित करता हूं, तो मैं इसे माध्यमिकसाइट में विलय करना चाहता हूं लेकिन मैं टेम्पलेट फ़ाइलों को विलय से बाहर करना चाहता हूं।गिट -

मुझे आंशिक समाधान मिला How do I tell git to always select my local version for conflicted merges on a specific file? लेकिन यह केवल तभी काम करता है जब मैं दोनों शाखाओं में टेम्पलेट फ़ाइल बदलता हूं और संघर्ष होता है। जब कोई विवाद गिट नहीं होता है तो फ़ाइल के नए रिमोट संस्करण का उपयोग करें।

मैं पर गिट को कैसे बता सकता हूं कोई स्थानीय संघर्ष नहीं होने पर भी निर्दिष्ट स्थानीय फ़ाइलों को अपरिवर्तित छोड़ दें।

या शायद मैं समस्या के लिए पूरी तरह से गलत दृष्टिकोण का उपयोग करता हूं?

किसी भी मदद के लिए अग्रिम धन्यवाद।

+0

क्या आपको कभी इसका समाधान मिला? – pvinis

उत्तर

3

क्या आपने .gitignore का उपयोग करने का प्रयास किया है? गिट प्रलेखन में उपलब्ध विवरण here

+3

आपके सुझाव के लिए धन्यवाद। समस्या यह है कि मुझे दोनों शाखाओं में फ़ाइलों को ट्रैक करने की आवश्यकता है - मैं बस इन फाइलों को "शाखा विशिष्ट" रखना चाहता हूं। – Marcin

6

my answer on merge drivers में उल्लेख के रूप में, वे केवल संघर्ष के मामले में उपयोगी हैं।
applies to a merge=ours in a .gitattributes file: Merge strategies देखें।

एक बहुत ही उपयोगी विकल्प Git बता विशिष्ट फ़ाइलों विलय करने के लिए वे संघर्ष है जब की कोशिश नहीं, बल्कि किसी और की से अधिक मर्ज की अपनी तरफ का उपयोग करने के लिए है।

यह recent thread (2012) यह पुष्टि करता है:

वहाँ जबकि पूरी तरह से है कि पर नज़र रखी है और दोनों में मौजूद है एक फ़ाइल में परिवर्तन अनदेखी branchA से branchB करने और branchB से को branchA मर्ज करने के लिए एक रास्ता है शाखाओं?

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

तो आप मर्ज A में B कर सकता है, लेकिन (जैसे, "ours" रणनीति का प्रयोग करके) A की फ़ाइल की प्रतिलिपि रखने। लेकिन यह कह रहा है कि आपने ए और बी दोनों की स्थिति मानी है, और निर्णय लिया है कि A का संस्करण B में हुआ था। यदि आप बाद में A से B, B फ़ाइल के संस्करण से विलय करना चाहते हैं तो मर्ज के परिणाम के रूप में भी नहीं माना जाएगा।

एक अलग विलय रणनीति के माध्यम से इस पर काम करने के लिए वास्तव में एक चालाक तरीका नहीं है; यह इतिहास संग्रह के लिए गिट की डेटा संरचना का एक मौलिक पहलू है।

यदि वे टेम्पलेट उप-निर्देशिका में हैं, तो रिपो को एक सबमिशन के रूप में शामिल करने के लिए, उन्हें अपने गिट रेपो में अलग करना सर्वोत्तम होता है।

यदि नहीं, तो आप फ़ाइलों में वापस लाना होगा गलत तरीके से (this thread के रूप में) करने से पहले विलय कर दिया:

git merge --no-commit other 
git checkout HEAD XYZ # or 'git rm XYZ' if XYZ does not exist on master 
git commit 
2

यहाँ Git अद्यतन सूचकांक - सूचकांक के लिए काम कर पेड़ में रजिस्टर फ़ाइल सामग्री।

git update-index --assume-unchanged <PATH_OF_THE_FILE> 

उदाहरण: -

git update-index --assume-unchanged somelocation/pom.xml

या

.gitignore

1

में फ़ाइल पथ जोड़ें या हो सकता है मैं जनसंपर्क करने के लिए पूरी तरह से गलत दृष्टिकोण का उपयोग oblem?

आप पूरी तरह से इस समस्या का गलत दृष्टिकोण का उपयोग कर रहे हैं :)

मुद्दा यह है कि शाखाओं, और उनके आसपास टूलींग, एक ही अंतर्निहित बात के विभिन्न संस्करणों को बनाए रखने के लिए किया जाता है।

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

आपका समझदार विकल्प हैं:

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

    उदाहरण के लिए।

    repo/supersite 
    repo/secondsite 
    repo/common 
    
  2. प्रत्येक साइट के लिए एक अलग रेपो बनाएं, और सामान्य फ़ाइलों को डुप्लिकेट करें। आप केवल

  3. प्रत्येक साइट के लिए एक अलग रेपो बनाते हैं, और सामान्य सामग्री के लिए एक तिहाई रेपो बनाते हैं, और एक जगह में सुपरसैट + आम को जोड़कर और सेकेंडसाइट + दूसरे में आम करने के लिए पनडुब्बियों का उपयोग कर सकते हैं।

    उदाहरण के लिए।

    super-repo/site # super site content 
    super-repo/common # common repo as submodule 
    second-repo/site # second site content 
    second-repo/common # same common repo as submodule 
    

    नोट submodules एक ही रेपो का उल्लेख है, लेकिन प्रत्येक उदाहरण के लिए एक अलग शाखा पर वर्तमान में है या

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

1

प्रत्येक में अपनी शाखाओं में, roo में फ़ाइल .gitattributes जोड़ें टी।

प्रत्येक शाखा के लिए, निर्दिष्ट इस तरह के विलय पर ध्यान नहीं दिया जा करने के लिए फ़ाइलों:

filename merge=ours 

और न उस के लिए ड्राइवर को सक्रिय करने के भूल जाते हैं:

git config --global merge.ours.driver true 

विलय का प्रयास करें, तो आप करेंगे देखें कि विलय होने पर प्रत्येक शाखा में .gitattributes में निर्दिष्ट फ़ाइलों को छूटा नहीं जाएगा।