2011-08-22 14 views
9

मुझे रिमोट पर पुश गिट करने की आवश्यकता है, और उस पुश को वर्तमान कार्यशील प्रति होने की आवश्यकता है। क्योंकि, धक्का स्रोत एक वेब होस्ट है। इसलिए, धक्का फ़ाइलों को वर्तमान में उपयोग में होने की आवश्यकता है। मुझे यकीन है कि कोई भी मेजबान :)गिट फोर्स वर्तमान कार्यशील निर्देशिका को धक्का दें

यह सवाल Is it possible to have a git repo inside another git repo और what difference does --bare switch make when initing a git repo?

संपादित इन 2 सवालों का पालन किया जाता है, पर फ़ाइलों को संपादित करेंगे: नंगे रेपो नहीं है मैं क्या चाहते हैं, के बाद से फ़ाइलें करने की आवश्यकता है सीधे रिमोट मशीन पर उपयोग किया जाता है, और उन स्थानों पर पाया जाना चाहिए जहां मैंने उन्हें रखा था।

EDIT2: यह मेरी समझ है कि नंगे रेपो फ़ाइल hieararchy नहीं रखने के लिए, और रूट निर्देशिका

उत्तर

10

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

अपने वेब होस्ट पर (में ssh'd):

# create an empty repo on your web host; note its path 
mkdir site 
cd site 
git init 

# configure it to allow pushes to the current checked-out branch 
# without complaining (direct push) 
git config receive.denyCurrentBranch ignore 
अपने स्थानीय रेपो (रेपो अंदर इन Git कमांड चलाने) के साथ

अब:

# create the reference to the web host remote for pushing 
# /path/to/the/repo is the path to the repo you made above on the web host: 
# it will be an absolute path OR relative to your ssh chroot (depends on the host) 
git remote add deploy ssh://[email protected]_host/path/to/the/repo 

# finally, push your changes! 
git push deploy master 

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

  • मैन्युअल अद्यतन करने के लिए निर्देशिका वर्किंग
  • यह स्वचालित रूप से करने के लिए एक git post-receive हुक बनाने के एक git checkout -f प्रदर्शन करने की जरूरत है।

तत्काल, post-receive हुक के साथ स्वचालित तैनाती के लिए यह git site deployment कैसे देखें।

+0

हम्म, मुझे जो कुछ भी चाहिए वह recieve.denyCurrentBranch था। धन्यवाद :) – yasar

+0

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

+0

पुhew, यह मेरे लिए एक कठिन काम था, लेकिन अभी भी इसे खींच लिया। धन्यवाद! – yasar

4

हालांकि यह पुराना है, यह एक काम करने वाले पेड़ को धक्का देने के लिए बेहद निराश है। https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior

एक बेहतर तरीका वेबसाइट के काम करने वाले पेड़ को मिरर करने के लिए एक बेहतर तरीका बनाना होगा।

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

निर्देशिका पदानुक्रम आप अपने वेब के लिए, मैं इसे ग्रहण करने के लिए जा रहा हूँ के साथ काम कर रहे हैं बिना जाने के लिए एक मानक वेबसाइट chrooted घर का उपयोग कर लेआउट है ईजी:/घर/उपयोगकर्ता/www

सर्वर के साथ ssh का उपयोग करते हुए Git स्थापित:

वर्तमान साइट की एक काम पेड़

cd /home/user/public_html 
git init 
git add . 
git commit -m "Initial Commit" 

दूरस्थ धक्का करने के लिए एक नंगे भंडार अपने स्थानीय सिस्टम से करने के लिए बनाएँ

+०१२३५१६४१०
mkdir /home/user/deploy.git 
cd /home/user/deploy.git 
git init --bare 

लिंक अपने काम पेड़ भंडार और अपने नंगे तैनाती भंडार

cd /home/user/public_html 
git remote add deploy /home/user/deploy.git 
git remote show deploy 
* remote deploy 
    URL: /home/user/deploy.git 
git push deploy master 

अब अपने स्थानीय सिस्टम पर एक नया रेपो की स्थापना

git clone ssh://[email protected]/home/user/deploy.git 
git branch -a 
*master 
    remotes/origin/HEAD 
    remotes/origin/master 

परिवर्तन अब हम सेटअप 2 हुक तुरन्त बनाने के लिए करने के लिए अपने वेब रिमोट रेपो जब आप इसे दबाते हैं या यदि कोई और जिसे आप इसे धक्का देने के लिए पहुंच देते हैं। चूंकि Git config receive.denyCurrentBranch लंबे समय

दूरस्थ सर्वर पर में परेशानी को बढ़ावा मिलेगा उपेक्षा तैनाती के लिए बाद अद्यतन सक्षम

cd /home/user/deploy.git/hooks 
mv post-update.sample post-update 
vi post-update 

नीचे करने के लिए अपने के बाद अद्यतन हुक को बदलें और बचाने

#!/bin/sh 
echo "Pulling changes into public_html [deploy post-update]" 
cd /home/user/public_html || exit 
unset GIT_DIR 
git pull deploy master 
exec git update-server-info 

अब हम आपके वेब काम करने वाले पेड़ को स्थापित करने के लिए अपने परिवर्तनों को धक्का देने के लिए सेट अप करते हैं यदि कुछ प्रतिबद्ध है।

cd /home/user/public_html/.git/hooks 
mv post-commit.sample post-commit 
vi post-commit 

फिर बदल निम्नलिखित

#!/bin/sh 
echo "Pushing changes to deploy [public_html post-commit]" 
git push deploy 

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

आशा है कि यह किसी और को ओपी के समान करने में मदद करेगा।

5

यह प्रश्न वास्तव में पुराना है, लेकिन मुझे यहां सूचीबद्ध समाधानों की तुलना में एक बेहतर समाधान (कम से कम मेरी स्थिति के लिए) मिला।

git config के लिए manual से

, Git 2.3.0 के रूप में:

एक अन्य विकल्प "updateInstead" जो (स्वच्छ होना चाहिए) कार्यशील निर्देशिका अद्यतन करेगा अगर वर्तमान शाखा की ओर धकेल दिया है। यह विकल्प कामकाजी निर्देशिकाओं को सिंक्रनाइज़ करने के लिए है, जब एक तरफ इंटरेक्टिव एसएसएच (जैसे एक लाइव वेबसाइट, इसलिए काम करने वाली निर्देशिका को साफ करने की आवश्यकता) के माध्यम से आसानी से पहुंचा जा सकता है।

तो git config receive.denyCurrentBranch updateInstead (प्राप्त करने वाले भंडार पर) ने मेरे लिए पूरी तरह से काम किया। यह मुझे और को स्वचालित रूप से प्राप्त करने वाले भंडार की कार्यशील निर्देशिका को अद्यतन करने की अनुमति देता है (जब तक कि धक्का होता है तब तक कार्यशील निर्देशिका साफ़ हो जाती है)।

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