मैं एक साइट है कि मैं एक HostNine साझा होस्टिंग पैकेज पर होस्ट किया था के साथ एक ही समस्या में भाग गया। वे आपको ssh
एक्सेस भी देते हैं , लेकिन वे दुर्भाग्य से git
स्थापित नहीं होते हैं और आपको चलाने के लिए एक्सेस भी नहीं देते हैं gcc
, जिससे आपके उपयोगकर्ता के लिए गिट डाउनलोड और इंस्टॉल करना मुश्किल हो जाता है।
जिस तरह से मैं इन प्रतिबंधों के आसपास काम करने के बारे में सोच सकता था, वह एक और कंप्यूटर से प्राप्त जीनेट बायनेरिज़ पर कॉपी करना था जो उनके पास था। शायद वही समाधान आपके और आपके GoDaddy के साझा होस्ट के लिए काम करेगा। यहाँ मैंने क्या किया है:
सबसे पहले यह पता लगाएं कि आपके सर्वर में क्या आर्किटेक्चर है। मेरे मामले में यह 32-बिट (i386) था। यह पता लगाने के कुछ तरीके हैं:
# uname -a
Linux ___.myserverhosts.com 2.6.18-128.1.6.el5PAE #1 SMP Wed Apr 1 10:02:22 EDT 2009 i686 i686 i386 GNU/Linux
# file /bin/echo
/bin/echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
आगे आपको उसी आर्किटेक्चर के साथ लिनक्स चलाने वाले एक और कंप्यूटर को खोजने की जरूरत है और उस पर स्थापित git के साथ। उन्हें लिनक्स के समान वितरण या संस्करण को चलाने की भी आवश्यकता नहीं है, जब तक कि वे एक ही आर्किटेक्चर न हों और आपको आवश्यक बायनेरी और लाइब्रेरी फाइल्स मिल सकें।
मुख्य गिट बाइनरी के स्थान को खोजने के लिए:
> which git
/usr/local/bin/git
कुछ अन्य महत्वपूर्ण बायनेरिज़ (जैसे git-receive-pack
) भी एक ही डायरेक्टरी में रहते हैं, इसलिए मैं /usr/local/bin/git*
यह सुनिश्चित करने के लिए सभी की नकल करने की सलाह देता हूं कि आपको अपनी जरूरत की हर चीज मिल जाए।
अन्य महत्वपूर्ण फाइलें यह हैं कि git स्रोत प्रणाली पर कहीं न कहीं 'libexec' निर्देशिका के अंतर्गत है। यदि आप इन पर प्रतिलिपि नहीं बनाते हैं, तो आप एक आश्चर्यजनक त्रुटि संदेश प्राप्त कर सकते हैं जब आप ऐसा करने की कोशिश करते हैं git push
, जैसे मैंने किया था:
git: 'index-pack' is not a git-command. See 'git --help'.
लक्ष्य_होस्ट पर मुख्य git पुस्तकालयों वाली निर्देशिका को खोजने के लिए, आप इसका उपयोग कर सकते हैं:
> git --exec-path
/usr/local/libexec/git-core
मैं पहले उन फाइलों को कॉपी करने की सलाह दूंगा और फिर यह देखने की कोशिश करूंगा कि क्या यह किसी भी लापता साझा लाइब्रेरी के बारे में शिकायत करता है। यदि यह नहीं है, तो आप जाने के लिए (संभवतः) अच्छे हैं। अगर ऐसा होता है, तो पढ़ते रहें। (साझा पुस्तकालयों पर नकल का कोई उपयोग नहीं है यदि वे पहले से ही लक्ष्य होस्ट पर मौजूद हैं और सही संस्करण हैं।)
आप के साथ फ़ाइलों को कॉपी कर सकते हैं scp
, rsync
, ftp
, या जो भी आप के साथ सहज हैं। मैंने इस्तेमाल किया scp
, कुछ इस तरह से:
> ssh target_host 'mkdir -p ~/bin ~/libexec'
> scp /usr/local/bin/git* target_host:~/bin
> scp -r /usr/local/libexec/git-core target_host:~/libexec
उसके बाद target_host पर ssh करें। आपको कुछ लाइनों को अपने जैसे जोड़ना होगा ~/.bashrc
:
export PATH=$PATH:~/bin
export LD_LIBRARY_PATH=~/lib
export GIT_EXEC_PATH=~/libexec/git-core
यदि आप इस चरण को भूल जाते हैं, तो आप इस त्रुटि को देखकर आश्चर्यचकित हो सकते हैं git push
:
git-receive-pack: command not found
यह git.or.cz पर Git FAQ में प्रलेखित है:
मूल रूप से समस्या यह है कि 'git-receive-pack' दूरस्थ अंत में डिफ़ॉल्ट $ PATH में नहीं है।
...
- सुनिश्चित करें कि आपके पास सही रास्ता है
.bashrc
(न केवल .bash_profile
)
GIT_EXEC_PATH
पर प्रलेखित है man git
:
--exec-path
Path to wherever your core git programs are installed.
This can also be controlled by setting the GIT_EXEC_PATH
environment variable. If no path is given, git will print
the current setting and then exit.
अपने नए स्रोत ~/.bashrc
। अब दौड़ने की कोशिश करो git
।
यह वही है जिसने मुझे पहली बार दिया:
> git
git: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
मैं स्रोत मशीन पर इसे चलाकर कॉपी करने के लिए साझा पुस्तकालयों के स्थान का पता लगाने में सक्षम था:
> ldd /usr/local/bin/git
libz.so.1 => /usr/lib/libz.so.1 (0xb7fcf000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0xb7ee4000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7ed2000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7da6000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb7d92000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb7d2d000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0xb7d2a000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7d08000)
libresolv.so.2 => /lib/libresolv.so.2 (0xb7cf5000)
libdl.so.2 => /lib/libdl.so.2 (0xb7cf1000)
/lib/ld-linux.so.2 (0xb7fe8000)
मेरे मामले में मैं सिर्फ नकल करना पड़ा /lib/libcrypto.so.4
के लिए खत्म हो ~/lib
मेरी पर target_host
और सब कुछ ठीक था।
अब आपके पास git
अपने साझा किए गए होस्टिंग सर्वर पर काम करना चाहिए और आपको इसे पुश करने में सक्षम होना चाहिए!
अब आपको या तो अपने सर्वर पर एक नया गिट रिपॉजिटरी और वर्क ट्री बनाने की जरूरत है या अपने मौजूदा रिपोजिटरी / वर्क ट्री को कॉपी करें।
वैसे, मुझे नहीं लगता कि इस मामले में आप सर्वर पर एक नंगे भंडार चाहते हैं, क्योंकि आपने कहा था कि आप वास्तविक सामग्री फ़ाइलों को तैनात करना चाहते थे (केवल उन config HEAD objects/ refs/
फ़ाइलों के विपरीत जो नंगे भंडार में शामिल होंगी) यदि आप एक कर git push
।
toolmantim.com एक नियमित गिट रिपॉजिटरी और एक नंगे रिपॉजिटरी के बीच के अंतर को बताता है:
एक डिफ़ॉल्ट गिट रिपॉजिटरी मानती है कि आप इसे अपनी वर्किंग डाइरेक्टरी के रूप में इस्तेमाल कर रहे हैं, इसलिए git सभी प्रॉजेक्ट फाइलों के साथ .it डायरेक्टरी में वास्तविक नंगे रिपोजल फाइल को स्टोर करता है। दूरस्थ रिपॉजिटरी को काम की प्रतियों के विपरीत फाइल सिस्टम पर फ़ाइलों की प्रतियों की आवश्यकता नहीं होती है, सभी की जरूरत है वे डेल्टास और बाइनरी हैं जो कि रिपॉजिटरी के ही नहीं हैं। यही "नंगे" का अर्थ है, चुगली करना। सिर्फ भंडार है।
मैं उस क्षण के लिए मान लूंगा कि आपने पहले ही अपनी निर्देशिका बना ली है target_host
जहाँ आप अपनी वेब साइट (या जो भी आप तैनात कर रहे हैं) को तैनात करना चाहते हैं। चलो उस निर्देशिका को बुलाओ ~/www/my_site
। आपके पास अपनी सभी फ़ाइलों पर ftp'd भी हो सकती है ~/www/my_site already
। (चाहे आपके पास है या नहीं यह महत्वपूर्ण नहीं है।) मैं उस क्षण के लिए भी मानूंगा कि आपने पहले ही .it उपनिर्देशिका की नकल नहीं की थी ~/www/my_site
(यदि आपके पास यह ठीक है तो काम करना चाहिए)।
चूंकि पहले से ही लक्ष्य_होस्ट पर आरंभिक जीओस रिपॉजिटरी नहीं है, इसलिए आपका पहला कदम एक बनाना होगा:
> cd ~/www/my_site
> git init
फिर जो भी मेजबान आपके द्वारा तैनात किए जाने वाले नवीनतम परिवर्तनों के साथ रिपॉजिटरी है (आपका विकास बॉक्स, मुझे लगता है), आपको बस तैनाती के लिए ऐसा कुछ करना होगा:
> git push --all ssh://username@target_host:port/~/www/my_site/.git
यदि आपकी रिपॉजिटरी target_host
पहले से अद्यतित नहीं है तो आप इस तरह की चेतावनी देख सकते हैं :
> warning: updating the current branch
> warning: Updating the currently checked out branch may cause confusion,
> warning: as the index and work tree do not reflect changes that are in HEAD.
> warning: As a result, you may see the changes you just pushed into it
> warning: reverted when you run 'git diff' over there, and you may want
> warning: to run 'git reset --hard' before starting to work to recover.
> warning:
> warning: You can set 'receive.denyCurrentBranch' configuration variable to
> warning: 'refuse' in the remote repository to forbid pushing into its
> warning: current branch.
> warning: To allow pushing into the current branch, you can set it to 'ignore';
> warning: but this is not recommended unless you arranged to update its work
> warning: tree to match what you pushed in some other way.
> warning:
> warning: To squelch this message, you can set it to 'warn'.
> warning:
> warning: Note that the default will change in a future version of git
> warning: to refuse updating the current branch unless you have the
> warning: configuration variable set to either 'ignore' or 'warn'.
(सामान्य git
उपयोग में आप उस संदेश को कभी नहीं देख सकते हैं, मुझे लगता है, क्योंकि आप सामान्य रूप से नंगे रिपोजिटरी पर जोर दे रहे हैं । लेकिन चूंकि इस मामले में हमारी दूरस्थ रिपॉजिटरी एक काम के पेड़ और एक सूचकांक दोनों के साथ एक सामान्य रेपो है, git
इसलिए यह काफी चिंतित है कि यह हो सकता है कुछ गड़बड़ करो।)
मुझे लगता है कि आपके सर्वर पर 'इग्नोर' करने के लिए इसे सेट करना हमारे लिए सुरक्षित है, हालाँकि, क्योंकि आप वहाँ सीधे रिपॉजिटरी में कोई कमिट नहीं कर रहे हैं। (सभी कमिट्स को संभवतः आपके विकास भंडार में उत्पन्न होना चाहिए और फिर सर्वर पर धकेल दिया जाना चाहिए।)
इसलिए आगे बढ़ें और इसे सेट करें ताकि आपको हर बार पुश करते समय चेतावनी न दिखाई दे:
> ssh target_host 'cd ~/www/my_site/; git config receive.denyCurrentBranch ignore'
push
खुद ही अपडेट सूचकांक, तथापि, नहीं काम पेड़ अपने आप में फ़ाइलें। उन फ़ाइलों को अद्यतन करना केवल पूरे बिंदु का एक प्रकार है जो हम करने की कोशिश कर रहे हैं, हालांकि, इसलिए हमारा काम तब तक नहीं किया जाता है जब तक कि हम git
सूचकांक की सामग्री को कार्य के पेड़ को स्वयं लिखना नहीं चाहते हैं, जैसे:
> ssh target_host 'cd ~/www/my_site/; git reset --hard'
(नोट: सर्वर पर आपके कार्य ट्री में आपके द्वारा किए गए किसी भी परिवर्तन को रिपॉजिटरी में क्या लिखा जाएगा।)
मैंने भी मैटिकस के सुझाव का पालन किया और अपने सर्वर के लिए एक रिमोट बनाया:
> git remote add h9 ssh://username@target_host:port/~/www/my_site/.git
इसलिए अब मुझे केवल यही करना है कि वह तैनाती करे:
> git push --all --force h9
> ssh remote_host 'cd ~/www/my_site/; git reset --hard'
मैं यहां तक गया कि इन कमांडों को एक स्क्रिप्ट में फेंक दूं जिसे मैंने script/deploy
किसी भी समय नामित किया है जिसे मैं तैनात करना चाहता हूं मेरे पास चलाने के लिए केवल एक ही कमांड है।
कृपया मुझे बताएं कि क्या आप इन निर्देशों में कोई गलती पाते हैं या यदि आप एक बेहतर समाधान के बारे में जानते हैं।