আমি কোনও হোস্টনেইনকে হোস্টিং প্যাকেজ ভাগ করে নেওয়ার জন্য যে সাইটটি হোস্ট করেছি তাতে একই সমস্যা দেখা দিয়েছে। তারাও আপনাকে ssh
অ্যাক্সেস দেয় তবে দুর্ভাগ্যক্রমে তাদের এগুলি নেইgit
ইনস্টল করেনি এবং চালানোর জন্য আপনাকে অ্যাক্সেসও দেয় না gcc
, এটি আপনার ব্যবহারকারীর জন্য গিট ডাউনলোড করা এবং ইনস্টল করা আরও কঠিন করে তোলে।
আমি এই বিধিনিষেধের আশেপাশে কাজ করার একমাত্র উপায়টি হ'ল গিট বাইনারিগুলি অন্য একটি কম্পিউটার থেকে অনুলিপি করা। সম্ভবত একই সমাধানটি আপনার এবং আপনার গোডাডি শেয়ার্ড হোস্টের জন্য কাজ করবে। আমি যা করেছি তা এখানে:
আপনার সার্ভারের কী আর্কিটেকচার রয়েছে তা প্রথমে বের করুন। আমার ক্ষেত্রে এটি 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
এরপরে আপনাকে একই আর্কিটেকচার এবং এটিতে ইনস্টল করা গিট সহ আরও একটি কম্পিউটার চালিত লিনাক্সের সন্ধান করতে হবে। এমনকি লিনাক্সের একই বিতরণ বা সংস্করণটি চালানোর দরকার নেই, যতক্ষণ না তারা একই আর্কিটেকচার এবং আপনি যে বাইনারি এবং লাইব্রেরি ফাইলগুলি প্রয়োজন সেগুলি পেতে পারেন।
প্রধান গিট বাইনারি এর অবস্থান সন্ধান করতে:
> which git
/usr/local/bin/git
কিছু অন্যান্য গুরুত্বপূর্ণ বাইনারি (যেমন git-receive-pack
) এছাড়াও একই ডিরেক্টরিতে থাকে, তাই /usr/local/bin/git*
আপনার প্রয়োজনীয় সমস্ত কিছু পেয়েছেন তা নিশ্চিত করার জন্য আমি কেবলমাত্র সমস্তটির অনুলিপি করার পরামর্শ দিই ।
অন্যান্য গুরুত্বপূর্ণ ফাইলগুলি হ'ল গিট নির্ভর করে সোর্স সিস্টেমের কোথাও একটি 'লিবেক্সেক' ডিরেক্টরিতে। আপনি যদি এগুলি অনুলিপি না করেন তবে আপনি git push
যেমন করার মতো চেষ্টা করার সময় আপনি একটি আশ্চর্যজনক ত্রুটি বার্তা পেতে পারেন:
git: 'index-pack' is not a git-command. See 'git --help'.
টার্গেট_হোস্টের মূল গিট লাইব্রেরি ধারণকারী ডিরেক্টরিটি সন্ধান করতে আপনি এটি ব্যবহার করতে পারেন:
> git --exec-path
/usr/local/libexec/git-core
আমি প্রথমে এই ফাইলগুলি অনুলিপি করার এবং তারপরে গিট চালানোর চেষ্টা করার পরামর্শ দিচ্ছি এটি কোনও অনুপস্থিত ভাগ করা লাইব্রেরি সম্পর্কে অভিযোগ করে কিনা। যদি এটি না হয় তবে আপনি (সম্ভবত) ভাল to যদি তা হয় তবে পড়তে থাকুন। (ভাগ করা লাইব্রেরিগুলি যদি ইতিমধ্যে লক্ষ্য হোস্টে উপস্থিত থাকে এবং সঠিক সংস্করণ হয় তবে তাদের অনুলিপি করার কোনও প্রয়োজন নেই))
আপনার সাথে ফাইল কপি করতে পারেন 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
তারপরে টার্গেট_ হোস্টে এসএসএস করুন। আপনার এগুলির মতো কিছু লাইন যুক্ত করতে হবে ~/.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 এ গিট FAQ এ নথিভুক্ত করা হয়েছে:
মূলত সমস্যাটি হ'ল 'গিট-রিসিভ-প্যাক' দূরবর্তী প্রান্তে ডিফল্ট $ 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
।
টুলম্যান্টিম.কম একটি নিয়মিত গিট সংগ্রহস্থল এবং একটি খালি সংগ্রহস্থলের মধ্যে পার্থক্য ব্যাখ্যা করে:
একটি ডিফল্ট গিট সংগ্রহস্থল অনুমান করে যে আপনি এটিকে আপনার কার্যক্ষম ডিরেক্টরি হিসাবে ব্যবহার করবেন তাই গিট সমস্ত প্রকল্প ফাইলের পাশাপাশি একটি .git ডিরেক্টরিতে প্রকৃত খালি সংগ্রহস্থল ফাইল সংরক্ষণ করে। রিমোট রিপোজিটরিগুলিতে ওয়ার্কিং কপিগুলির বিপরীতে ফাইল সিস্টেমে ফাইলের অনুলিপিগুলির প্রয়োজন হয় না, কেবলমাত্র ডেল্টা এবং বাইনারি হ'ল সংগ্রহস্থলটির কী-নোট। এই "খালি" গিট মানে কি। খালি ভান্ডার।
আমি এই মুহুর্তের জন্য ধরে নেব যে আপনি ইতিমধ্যে target_host
আপনি যেখানে আপনার ওয়েবসাইটটি (বা আপনি নিযুক্ত করছেন যা কিছু) স্থাপন করতে চান সেখানে একটি ডিরেক্টরি তৈরি করেছেন । চলুন যে ডিরেক্টরি কল ~/www/my_site
। আপনি এমনকি আপনার সমস্ত ফাইলের উপরে এটিও করতে পারেন ~/www/my_site already
। (আপনার কাছে থাকা বা না হওয়া গুরুত্বপূর্ণ নয়)) আমি সেই মুহুর্তের জন্যও ধরে নেব যে আপনি ইতিমধ্যে .git সাব-ডিরেক্টরিকে অনুলিপি করেন নি ~/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
ব্যবহারে আপনি কখনই সেই বার্তাটি দেখতে পাচ্ছেন না বলে আমি মনে করি, কারণ আপনি সাধারণত খালি ভাণ্ডারগুলিতে চাপ দিচ্ছেন But তবে আমাদের দূরবর্তী সংগ্রহস্থল যেহেতু কার্য গাছ এবং সূচক উভয়ই একটি সাধারণ রেপো তাই বোধহয় 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
কোনও সময় আমি মোতায়েন করতে চাই আমার কাছে কেবল একটি কমান্ড চালানোর দরকার আছে।
আপনি যদি এই নির্দেশাবলীগুলিতে কোনও ভুল খুঁজে পান বা আরও ভাল সমাধান সম্পর্কে জানেন তবে দয়া করে আমাকে জানান।