मैं हरितोक में अपने गिट रेपो के केवल एक उपनिर्देशक को कैसे तैनात / धक्का दे सकता हूं?


121

मेरे पास एक प्रोजेक्ट है जो Serve का उपयोग करता है और Git का उपयोग करके नियंत्रित संस्करण है। परोसें outputस्थिर फ़ाइलों के साथ एक फ़ोल्डर बनाता है जिसे मैं हरोकू में तैनात करना चाहता हूं।

मैं हर्कोव देवदार के ढेर के बाद से सीरवी परियोजना को तैनात नहीं करना चाहता हूं, लेकिन यह बहुत महत्वपूर्ण नहीं है, लेकिन सबसे महत्वपूर्ण बात यह है कि मैं स्थैतिक वेबसाइटों के लिए हरोकू के महान समर्थन का लाभ उठाना चाहता हूं।

वहाँ एक git रिमोट के लिए एक सबफ़ोल्डर तैनात करने का एक तरीका है? क्या मुझे outputफ़ोल्डर में एक Git रेपो बनाना चाहिए (जो गलत लगता है) और उसे Heroku पर धकेलें?


जवाबों:


220

Git-subtree के माध्यम से एक और भी आसान तरीका है । यह मानते हुए कि आप अपने फ़ोल्डर 'आउटपुट' को हर्को की जड़ के रूप में धकेलना चाहते हैं, आप यह कर सकते हैं:

git subtree push --prefix output heroku master

ऐसा प्रतीत होता है कि git-subtree को git-core में शामिल किया जा रहा है, लेकिन मुझे नहीं पता कि git-core का वह संस्करण अभी तक जारी किया गया है या नहीं।


1
हां, लेकिन सबट्री अभी भी (1.8.0.2 के रूप में) गिट इंस्टॉलर के माध्यम से शामिल नहीं है । सौभाग्य से स्रोत से स्थापित त्वरित और सीधा है, इस पृष्ठ ने मेरे लिए मैक पर काम किया।
दिनांक

14
यदि आपको आवश्यकता हो --force, तो उपयोग करें git push heroku `git subtree split --prefix output master`:master --forceStackoverflow.com/a/15623469/2066546 देखें ।
21

2
लेकिन किसी विशिष्ट टैग को पुश करने का सही तरीका क्या है। मुझे लगा कि यह होना चाहिए git subtree push --prefix output heroku +refs/tags/v1.0.0:refs/heads/master। लेकिन यह काम नहीं करता है और वापस आता है +refs/tags/v1.0.0:refs/heads/master does not look like a ref। मुझे इस तरह की कार्यक्षमता की आवश्यकता है ताकि बाद में विशिष्ट टैग पर वापस आ सकूं। ऐसा करने का सही तरीका क्या है?
डेनिस

1
मुझे त्रुटि मिलती है 'अपडेट्स को अस्वीकार कर दिया गया क्योंकि एक धक्का दिया गया शाखा टिप अपने रिमोट के पीछे है'
सहयोगी

2
@-dev @Eric Burel मैंने उस outputफ़ोल्डर को सफलतापूर्वक निर्दिष्ट किया जो केवल मेरी developशाखा पर ही heroku masterनिर्दिष्ट किए बिना शाखा में मौजूद था develop:master, इसलिए जाहिर तौर पर यह आपके द्वारा वर्तमान में जाँची गई शाखा से निर्दिष्ट लक्ष्य शाखा को धक्का देता है।
cccrack 14

10

मैंने जॉन बेरीमैन के साथ जो शुरू किया था, लेकिन वास्तव में यह सरल हो सकता है यदि आप हरोकू गिट इतिहास के बारे में परवाह नहीं करते हैं।

cd bin
git init
git add .
git commit -m"deploy"
git push git@heroku.com:your-project-name.git -f
rm -fr .git

मुझे लगता है कि आधिकारिक git subtreeसबसे अच्छा जवाब है, लेकिन मेरे पास मेरे मैक पर काम करने के लिए सबट्री होने का मुद्दा था।


9

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

#!/bin/bash

#change to whichever directory this lives in
cd "$( dirname "$0" )"

#create new git repository and add everything
git init
git add .
git commit -m"init"
git remote add heroku git@heroku.com:young-rain-5086.git

#pull heroku but then checkback out our current local master and mark everything as merged
git pull heroku master
git checkout --ours .
git add -u
git commit -m"merged"

#push back to heroku, open web browser, and remove git repository
git push heroku master
heroku open
rm -fr .git

#go back to wherever we started.
cd -

मुझे यकीन है कि इस पर सुधार करने के लिए बहुत सारे तरीके हैं - तो मुझे यह बताने के लिए स्वतंत्र महसूस करें कि कैसे!


+1धन्यवाद। यदि आप हरोकू पर गिट लॉग के बारे में परवाह नहीं करते हैं तो यह समाधान बहुत अच्छा है। मामले में स्क्रिप्ट के ऊपर एक घुमाया जा सकता है कुछ फ़ोल्डर हैं जिन्हें आप अनदेखा करना चाहते हैं, आवेदन उप पथ के भीतर तैनात किया जाना है। उदाहरण के लिए मुझे specहरोको पर फ़ोल्डर नहीं चाहिए था । उदाहरण
Gist

+1लेकिन आप उसे खींचकर और उसे हेरोकू मास्टर में विलय करके सरल बना सकते हैं और इसके बजायgit push --force heroku master
MK Safi

4

अलग-अलग चीज़ों को आज़माने और हर बार काटे जाने के एक लंबे और कठिन महीने के बाद मैंने महसूस किया,

सिर्फ इसलिए कि हरोकू एक तैनाती तंत्र के रूप में एक गिट रिपॉजिटरी का उपयोग करता है, आपको इसे गिट रिपॉजिटरी के रूप में नहीं मानना ​​चाहिए

यह rsync बस के रूप में अच्छी तरह से हो सकता था, वे गिट के लिए चले गए, इस वजह से विचलित न हों

यदि आप ऐसा करते हैं, तो आप अपने आप को सभी प्रकार की चोटों के लिए खोल देते हैं। उपरोक्त सभी समाधान कहीं न कहीं बुरी तरह विफल हैं:

  1. इसे हर बार, या समय-समय पर, या अनपेक्षित चीजें होने के लिए कुछ करना पड़ता है (सबमोडुल्स को धक्का देना, उपशीर्षक को सिंक्रनाइज़ करना, ...)
  2. यदि आप अपने कोड को संशोधित करने के लिए उदाहरण के लिए एक इंजन का उपयोग करते हैं, तो बुंदेलर आपको जीवित खाएगा, इस खोज के लिए एक अच्छा समाधान खोजने के लिए खोज के दौरान उस परियोजना के साथ मुझे जो निराशा हुई है, उसका वर्णन करना असंभव है
    • आप इंजन को git रेपो लिंक + के रूप में जोड़ने का प्रयास करते हैं + bundle deploy- विफल, आपको हर बार अपडेट को बंडल करने की आवश्यकता होती है
    • आप इंजन को :path+ bundle deploy- असफल के रूप में जोड़ने की कोशिश करते हैं, देव टीम मानती है:path विकल्प है "आप इस मणि विकल्प के साथ बुंडलर का उपयोग नहीं कर रहे हैं" इसलिए यह उत्पादन के लिए बंडल नहीं करेगा।
    • इसके अलावा, इंजन का हर रिफ्रेश आपके रेल स्टैक को अपडेट करना चाहता है -_-
  3. केवल समाधान मैंने पाया है कि इंजन का उपयोग /vendorविकास में एक सिम्लिंक के रूप में किया जाता है , और वास्तव में उत्पादन के लिए फाइलों को कॉपी किया जाता है

समाधान

प्रश्न में एप्लिकेशन में git रूट की 4 परियोजनाएं हैं:

  1. एपीआई - प्रोफाइल के आधार पर 2 अलग-अलग हरोकू होस्ट्स पर चलेंगे - अपलोड करें और एपीआई करें
  2. वेब - वेबसाइट
  3. वेब-पुरानी - पुरानी वेबसाइट, अभी भी माइग्रेशन में
  4. सामान्य - एक इंजन में निकाले गए सामान्य घटक

इंजन vendor/commonकी जड़ को देखकर सभी परियोजनाओं में एक सहानुभूति होती है common। हरकोको की तैनाती के लिए सोर्स कोड का संकलन करते समय हमें प्रत्येक अलग होस्ट के वेंडर फोल्डर में शारीरिक रूप से कोड होने वाले सिमलिंक और rsync को हटाना होगा।

  1. होस्टनाम की एक सूची को तर्क के रूप में स्वीकार करता है
  2. आपके विकास रेपो में एक गिट पुश को चलाता है और फिर एक अलग फ़ोल्डर में एक साफ गिट्टी को चलाता है, जिससे यह सुनिश्चित हो जाता है कि कोई गंदा (असम्बद्ध) परिवर्तन स्वचालित रूप से मेजबानों को धकेल दिया जाता है
  3. मेजबानों को समानांतर में तैनात करता है - हर हरोकू गैट रेपो को खींचा जाता है, नए कोड को सही स्थानों पर rsynced किया जाता है, जो कमिट कमेंट में बुनियादी धक्का सूचना के साथ शुरू होता है,
  4. अंत में, हम कर्ल के साथ एक पिंग भेजते हैं ताकि हॉबी मेजबानों को जगाया जा सके और लॉग्स को पूँछने के लिए यह देखने के लिए कि क्या सब शराब गए हैं
  5. जेनकिंस के साथ भी अच्छा खेलता है: डी (सफल परीक्षण के बाद सर्वर का परीक्षण करने के लिए स्वचालित कोड पुश)

6 महीने में अब न्यूनतम (नहीं?) समस्याओं के साथ जंगली में बहुत अच्छा काम करता है

यहां स्क्रिप्ट https://gist.github.com/bbozo/fafa2bbffcc7b12d923f

अपडेट १

@AdamBuczynski, यह इतना सीधा कभी नहीं है।

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

2 आप परियोजनाओं के बीच कोड साझा करना चाहते हैं - अब sync_commonहिस्सा आता है , विकास में सहानुभूति के साथ shennanigans Heroku पर वास्तविक rsynced कोड द्वारा प्रतिस्थापित किया जा रहा है क्योंकि Heroku को एक निश्चित फ़ोल्डर संरचना और बंडल और रूबी की आवश्यकता होती है यदि आप वास्तव में चीजों को बदसूरत बनाते हैं एक मणि में आम धागे निकालना चाहते हैं

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

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

मैं वास्तव में एक Rakefile या कुछ में बंडल चीजों की खोज पर विचार करना चाहिए और इस तरह से सब कुछ करना चाहिए ...


Hi @bbozo, क्या आप अपने समाधान को थोड़ा सा संघनित करने का मन बनाएंगे और एक विशिष्ट उप फ़ोल्डर को एक विशिष्ट हरोकू प्रोजेक्ट पर तैनात करने के उपयोग के मामले में विशिष्ट बनाने के लिए और हर वो सामान निकालेंगे जिसकी जरूरत हरकोको को नहीं है?
एडम रीस

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

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