गेट रेपो और प्रोडक्शन वेबसाइट को तोड़े बिना ड्रुपल कोर को अपग्रेड करने के लिए सबसे अच्छा अभ्यास क्या है


13

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

यह एक अच्छी रणनीति की तरह लग रहा था जब तक मुझे ड्रुपल को अपग्रेड नहीं करना पड़ा। मुझे एहसास हुआ कि अगर चीजें खराब हो जाती हैं, तो मैं वापस रोल करने में सक्षम होना चाहता हूं और ऐसा करने के लिए गिट से बेहतर उपकरण का उपयोग क्या करना है। मैंने सोचा था कि यह एक सुविधा शाखा के लिए सही स्थिति होगी, इसलिए मैंने एक drupal-7.14शाखा बनाई , इसे अपने .gitignoreसभी कोड और सेटिंग्स फ़ाइलों को अनदेखा करने और केवल उन फ़ाइलों पर ध्यान देने के लिए दिया जो ड्रुपल इंस्टॉल का हिस्सा हैं जो मैं नहीं करूंगा ' छूना मत। मैंने हाथ से अपग्रेड (डाउनलोड, अनज़िप, अनटार, कॉपी) किया, बॉर्डरलाइन मामलों जैसे कि रोबॉट्स.टेक्स्ट और .htaccess के माध्यम से सॉर्ट करना, और ड्रुपल की .ignignore को अपने साथ लिखना। मैंने कुछ सेटिंग्स तय कीं जो कि 500 ​​त्रुटि से उबरने के लिए 7.14 के साथ नहीं बल्कि 7.15 के साथ काम करती हैं, और फिर सब कुछ सही लग रहा था। मैंने शाखा का नाम बदल दिया drupal-7.15और अपने रास्ते पर खुशी से जाने वाला था।

जब तक मुझे एहसास नहीं हुआ कि मैंने अनजाने में क्या किया था: फाइलें जो पहले मेरी मास्टर शाखा द्वारा अनट्रैक की गई थीं, लेकिन काम करने वाली निर्देशिका में छोड़ दी गई थीं, अब जब मैं मास्टर की जांच कर रहा था, तो उन्हें काम करने वाली निर्देशिका से हटा दिया गया था, क्योंकि वे अब अप्राप्त फाइलें नहीं थीं! डी 'ओह!

अगर मैं drupal-7.15मास्टर के साथ शाखा का विलय करता हूं तो मैं कोड को अलग कर दूंगा।

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

कुछ अन्य समाधान हो सकते हैं जिनके बारे में मैंने नहीं सोचा है।

मैं सबसे कम संभव गिरावट के साथ इससे कैसे उबर सकता हूं?

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

अद्यतन 2 : सबमॉड्यूलकाम नहीं कर सकता हैप्रो Git के अनुसार, "सबमॉड्यूल्स आपको एक Git रिपॉजिटरी को दूसरे Git रिपॉजिटरी के उपनिर्देशिका के रूप में रखने की अनुमति देता है"। Drupal ऐसी कोई अच्छी जुदाई प्रदान नहीं करता है। सभी ड्रुपल कोड एक उपनिर्देशिका में होने के बजाय, संबंध कम या ज्यादा उलटे होते हैं, लेकिन अभी भी कोई साफ अलगाव नहीं है, क्योंकि आप अपने .htaccess और robots.txt का संपादन कर रहे होंगे, इसलिए आपका कोड और Drupal repo एक साथ मिलाया जाता है। मैं इस समस्या को हल करने के लिए देख रहा हूँ।


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

2
@ लॉथेरियन मैं असहमत हूं। हर कोई अपने वर्तमान संस्करण से अपनी साइट को एक नए में अपग्रेड करने की इस प्रक्रिया से गुजरेगा। कोर को अपग्रेड करने के लिए गिट का उपयोग करना काफी सामान्य है, क्योंकि यह मॉड्यूल को अपग्रेड करने के लिए एक व्यापक रूप से उपयोग की जाने वाली विधि है। बहुत सारे लोग इस समस्या से जूझेंगे, जैसा कि मैंने पहले भी किया है। वर्तमान में वेब पर कोई अच्छा प्रलेखन नहीं है जो इस मुद्दे को संबोधित करता है और मेरा मानना ​​है कि यह इसके लिए एक अच्छी जगह है।
iStryker

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

ठीक है पर्याप्त ठीक है। ब्रैंडन की समस्या काफी सामान्य है। शायद मुझे एक नया प्रश्न बनाना चाहिए या इसे फिर से लिखना चाहिए (और बाकी को दूसरे प्रश्न पर ले जाना चाहिए)। पहले 2-3 पैराग्राफ आम हैं। आप 7.x-1.0 का git रेपो बनाते हैं और आप 7.x-1.1 में अपग्रेड करना चाहते हैं। समस्या फ़ाइलें हैं। .ignignore, .htaccess और robot.txt। कभी-कभी आप उन्हें ट्रैक करना चाहते हैं क्योंकि वे modded हैं, कभी-कभी आप उन्हें ट्रैक नहीं करना चाहते क्योंकि वे modded हैं। रेपो को अपग्रेड करते समय आप एक नई शाखा का विलय करते हैं या केवल मास्टर को अपडेट करते हैं। @Letharion सुझाव?
स्ट्रेकर

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

जवाबों:


10

उपरोक्त चर्चा से ऐसा लगता है कि आपका प्रश्न आपके git रेपो को ठीक करने के बारे में नहीं है, लेकिन git में एक Drupal साइट को बनाए रखने के बारे में है, और यह कि कोर अपडेट के साथ कैसे काम करता है।

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

मैंने जो समाधान उपयोग किया है वह सभी कोड को एक ही रिपॉजिटरी में रखने का है, जितना संभव हो उतने फ़ीचर या अन्य प्रकार के निर्यात / कोड / कॉन्फ़िगरेशन में रखें, और उन पैच की एक सूची बनाए रखें, जिन्हें आउट-ऑफ करने की आवश्यकता है -बॉक्स कोर और कंट्रीब।

जब आप कोर अपडेट करते हैं, तो अपने देव परिवेश में शुरू करें:

  • सुनिश्चित करें कि कार्यशील निर्देशिका साफ है
  • डंप नवीनतम डेटाबेस ( drush sql-dump)। या तो डंप के साथ एक प्रतिबद्ध बनाओ या इसे कहीं सुरक्षित बचाएं।
  • अद्यतन कोर ( drush up drupal)
  • सभी परिवर्तन करें।
  • पैच फ़ाइल की जाँच करें। यदि किसी भी पैच को लागू करने की आवश्यकता है, तो उन्हें लागू करें, और एक और प्रतिबद्ध बनाएं
  • अद्यतन चलाएँ। यदि आवश्यक हो तो (पहले से ही यदि आपने अद्यतन के लिए ड्रश का उपयोग किया है)
  • अपने देव स्थल का परीक्षण करें। यदि सब कुछ ठीक है, तो कोड को उत्पादन में धकेल दें। भागो drush updbउत्पादन पर।
  • यदि कोई समस्या है और आपको अपने रेपो को रिवर्ट या रिसेट git reset --hard HEAD~2करना चाहिए ( इसे करना चाहिए), या यदि आप इतिहास रखना चाहते हैं, तो दो कमिट्स को वापस लाएं। अपने डेटाबेस को डंप से बदलें।

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

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


0

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

मैंने इस मुद्दे के बारे में एक ब्लॉग पोस्ट बनाई है जो आपकी वेबसाइट पर Drupal Core को अपग्रेड कर रही है

वैकल्पिक तरीके

  1. Drush कमांड चलाएं drush up drupal
  2. संस्करणों के बीच अंतर का एक पैच लागू करें। Http://drupal.org/node/359234 और http://fuerstnet.de/en/drupal-upgrad-easier देखें

आपने यह नहीं बताया, लेकिन अगर आप ड्रुपल संस्करणों के बीच परिवर्तनों को ट्रैक करने में रुचि रखते हैं, तो मैं शाखाओं के बजाय टैग का उपयोग करके ऐसा करूंगा । एक बार जब आप अपने अपग्रेड को मास्टर के साथ कर लेते हैं , तो अपने कोड को 7.x के रूप में टैग करें।


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

हाँ सभी एक भंडार में। मेरे पास कोर / मुख्य रिपॉजिटरी के अंदर मॉड्यूल, प्रोफाइल और थीम हैं जो अपने स्वयं के गिट रिपोज हैं। मुझे नहीं पता कि सबसे अच्छा तरीका है, लेकिन इसका सबसे अच्छा तरीका है जो मुझे पता है।
12

यह समाधान वापस जाने का कोई रास्ता नहीं प्रदान करता है। वोट डाउन का मेरा कारण
आंद्रे बॉमिएर

@ शेरपेंटी: मैं यह नहीं देखता कि वापस जाने के लिए रास्ते की कमी एक पतन का कारण क्यों होना चाहिए। यदि यह सबसे अच्छा तरीका है, तो यह पर्याप्त है। यदि आपको नहीं लगता कि यह सबसे अच्छा तरीका है, तो कृपया बताएं कि क्यों नहीं।
आइकनोकॉस्ट

यदि आप अपने समय में वापस नहीं जा सकते तो @iconoclast एक संशोधन प्रणाली की बात क्या है? उदाहरण के लिए एक असफल अद्यतन के बारे में सोचो - यहाँ पुनर्प्राप्त करने का तरीका क्या होगा? "जो भी" सॉफ़्टवेयर का एक स्वीकृत संस्करण स्पष्ट निर्भरता होना चाहिए, इनमें विशेष रूप से फ्रेम कोर शामिल हैं। अन्यथा आप अपने गिट को सरल रूप से छोड़ सकते हैं और फिर से एफ़टीपी रोलआउट करना शुरू कर सकते हैं। सिर्फ मेरे 2 सेंट।
आंद्रे बॉमियर

0

मैं ओपी की तरह दो शाखाओं के साथ सेटअप चला रहा हूं: एक शाखा मेरे कस्टम कोड के साथ, और एक शाखा जिसमें मेरी कस्टम और कोर दोनों फाइलें हैं। मैं एक ही स्थिति में भाग गया: शाखाओं के बीच स्विच करने पर अनदेखा कोर फाइलें हटा दी जाती हैं।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.