"গিট থ্রি" এবং "গিট থ্রি - বার" এর মধ্যে পার্থক্য কী?


162

git initএবং এর মধ্যে পার্থক্য কী git init --bare? আমি খুঁজে পেয়েছি যে --bareতাদের গিট সার্ভারের জন্য প্রচুর ব্লগ পোস্টের প্রয়োজন ?

ম্যান পৃষ্ঠা থেকে এটি বলেছে:

--bare

একটি খালি সংগ্রহস্থল তৈরি করুন। GIT_DIR এনভায়রনমেন্ট সেট না করা থাকলে এটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে সেট করা আছে

তবে আসলে এর অর্থ কী? --bareগিট সার্ভার সেটআপের জন্য কি এটি প্রয়োজন ?

উত্তর:


143

নন-বেয়ার গিট রেপো

এই রূপটি একটি ওয়ার্কিং ডিরেক্টরি সহ একটি ভান্ডার তৈরি করে যাতে আপনি প্রকৃতপক্ষে ( git clone) কাজ করতে পারেন । এটি তৈরির পরে আপনি দেখতে পাবেন যে ডিরেক্টরিতে একটি .git ফোল্ডার রয়েছে যেখানে ইতিহাস এবং সমস্ত গিট নদীর গভীরতানির্ণয় যায়। .Git ফোল্ডার যেখানে আপনি সেই স্তরে কাজ করেন।

বেয়ার গিট রেপো

অন্যান্য রূপটি একটি ওয়ার্কিং ডিরেক্টরি ( git clone --bare) ছাড়াই একটি সংগ্রহস্থল তৈরি করে । আপনি যেখানে কাজ করতে পারেন সেখানে কোনও ডিরেক্টরি পাবেন না। ডিরেক্টরিতে থাকা সমস্ত কিছু এখন উপরের ক্ষেত্রে .git ফোল্ডারে কী ছিল।

আপনি কেন অন্য বনাম ব্যবহার করবেন

একটি কার্যনির্বাহী ডিরেক্টরি ছাড়া গিট রেপোগুলির প্রয়োজনীয়তা হ'ল আপনি শাখাগুলিকে এতে চাপ দিতে পারেন এবং কেউ কী কাজ করছে তা পরিচালনা করে না। আপনি এখনও এমন কোনও সংগ্রহশালার দিকে ঠেলাতে পারেন যা খালি নয়, তবে আপনি প্রত্যাখাত হবেন যেহেতু আপনি সম্ভাব্যভাবে সেই ডিরেক্টরিটিতে যে কাজ করছেন এমন একটি শাখা স্থানান্তর করতে পারবেন।

সুতরাং কোনও কার্যনির্বাহী ফোল্ডারবিহীন একটি প্রকল্পে, আপনি কেবলমাত্র বস্তুগুলিকে গিট স্টোর হিসাবে দেখতে পাবেন। তারা সংকুচিত এবং সিরিয়ালযুক্ত এবং তাদের সামগ্রীর SHA1 (একটি হ্যাশ) এর অধীনে সংরক্ষণ করা হয়। খালি সংগ্রহস্থলে git showকোনও অবজেক্ট পাওয়ার জন্য আপনাকে যে অবজেক্টটি দেখতে চাইবে তার sha1 নির্দিষ্ট করতে হবে এবং তারপরে তার প্রয়োজন হবে । আপনার প্রকল্পের মতো দেখতে কোনও কাঠামো আপনি দেখতে পাবেন না।

বেয়ার রিপোজিটরিগুলি সাধারণত কেন্দ্রীয় ভান্ডার হয় যেখানে প্রত্যেকে তাদের কাজকে সরিয়ে দেয়। আসল কাজটি হেরফের করার দরকার নেই। এটি একাধিক ব্যক্তির মধ্যে প্রচেষ্টা সিঙ্ক্রোনাইজ করার একটি উপায়। আপনি আপনার প্রকল্পের ফাইলগুলি সরাসরি দেখতে সক্ষম হবেন না।

আপনি যদি প্রকল্পের একমাত্র কাজ করছেন বা আপনি "যৌক্তিকভাবে কেন্দ্রীয়" সংগ্রহস্থল চান না / প্রয়োজন নেই তবে আপনার কোনও খালি সংগ্রহস্থলের প্রয়োজন নেই। এক পছন্দ করেন git pull থেকে যে ক্ষেত্রে অন্যান্য ভান্ডার। এটি নন-বেয়ার স্টোরগুলিতে চাপ দেওয়ার সময় গিটের আপত্তিগুলি এড়িয়ে চলে।

আশাকরি এটা সাহায্য করবে


রাখুন , বর্জন একটি এই লাইন থেকে - এক একটি অপরের থেকে Git টান পছন্দ করেন ... :-)
অরূপ রক্ষিত

10
আমি এই উত্তরটি খুব অস্পষ্ট এবং বিভ্রান্ত মনে করি। কয়েকটি কারণ এখানে রয়েছে: মেটা.স্ট্যাকওভারফ্লো.com
মার্কো অ্যাভলিজাš

Bare repositories are usually central repositories where everyone moves their work to.আপনি কি বলতে চাইছেন যে খালি সংগ্রহস্থল হ'ল এমন উত্স যা থেকে অন্যান্য প্রকল্পের সহযোগীরা কোনও প্রকল্প ক্লোন করতে পারে? যে, সহযোগীরা কি এটি হিসাবে বিবেচনা করে remote?
মিন ট্রান

111

সংক্ষিপ্ত উত্তর

একটি খালি সংগ্রহস্থল হ'ল একটি কার্যকরী অনুলিপি ব্যতীত গিট সংগ্রহস্থল, সুতরাং .git এর সামগ্রীটি সেই ডিরেক্টরিটির জন্য শীর্ষ স্তরের।

স্থানীয়ভাবে কাজ করার জন্য একটি নন-বেয়ার স্টোর এবং অন্যের সাথে আপনার পরিবর্তনগুলি ভাগ করে নেওয়ার জন্য কেন্দ্রীয় সার্ভার / হাব হিসাবে একটি খালি সংগ্রহস্থল ব্যবহার করুন। উদাহরণস্বরূপ, আপনি github.com এ একটি সংগ্রহস্থল তৈরি করার সময়, এটি একটি খালি সংগ্রহস্থল হিসাবে তৈরি করা হয়।

সুতরাং, আপনার কম্পিউটারে:

git init
touch README
git add README
git commit -m "initial commit"

সার্ভারে:

cd /srv/git/project
git init --bare

তারপরে ক্লায়েন্টের উপর, আপনি চাপ দিন:

git push username@server:/srv/git/project master

এরপরে আপনি টাইপিংটি রিমোট হিসাবে যুক্ত করে সংরক্ষণ করতে পারেন।

সার্ভার সাইডের ভাণ্ডারটি পুল এবং পুশের মাধ্যমে কমিটগুলি পেতে চলেছে, এবং আপনি ফাইল সম্পাদনা করে সার্ভার মেশিনে সেগুলি চালিত করে না, সুতরাং এটি একটি খালি সংগ্রহস্থল।

বিস্তারিত

আপনি কোনও সংগ্রহস্থলের দিকে ধাক্কা দিতে পারেন যা একটি খালি সংগ্রহস্থল নয়, এবং গিটটি জানতে পারে যে সেখানে একটি .git সংগ্রহস্থল রয়েছে, তবে বেশিরভাগ "হাব" সংগ্রহস্থলের একটি কার্যকরী অনুলিপি প্রয়োজন হয় না, তাই খালি সংগ্রহস্থল ব্যবহার করা স্বাভাবিক is এটি এবং সুপারিশ করা হয় কারণ এই ধরণের সংগ্রহস্থলগুলিতে কোনও কাজের অনুলিপি থাকার কোনও মানে নেই point

যাইহোক, আপনি যদি খালি নন সংগ্রহস্থলের দিকে চাপ দেন তবে আপনি ওয়ার্কিং কপিটি বেমানান করছেন, এবং গিট আপনাকে সতর্ক করবে:

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

আপনি এই সতর্কতা এড়িয়ে যেতে পারেন। তবে প্রস্তাবিত সেটআপটি হ'ল: স্থানীয়ভাবে কাজ করার জন্য একটি নন-বেয়ার রিপোজিটরি এবং হাব বা সেন্ট্রাল সার্ভার হিসাবে একটি খালি সংগ্রহস্থলটি চাপতে এবং এড়াতে ব্যবহার করুন।

আপনি যদি অন্য বিকাশকারীর কার্যকরী অনুলিপিটির সাথে সরাসরি কাজটি ভাগ করতে চান তবে আপনি চাপ দেওয়ার পরিবর্তে একে অপরের সংগ্রহস্থল থেকে টানতে পারেন।


আমি যদি আমার প্রকল্পটি গিট সার্ভারে কাজ করতে চাই, তবে --bare বিকল্পটি থাকা দরকার নেই, তাই না?
কিট হো

আপনি স্থানীয় একের জন্য নয়, দূরবর্তী সংগ্রহস্থলের জন্য খালি ব্যবহার করেন।
ডানকান

এটি কিছুক্ষণের জন্য, তবে এখানে আরও একটি প্রশ্ন। আমাদের যদি একটি খালি দূরবর্তী সংগ্রহস্থল থাকে, যে কোনও বিকাশকারী এটিতে একটি ধাক্কা টানতে পারে, একটি সংগ্রহস্থল হ'ল "কেন্দ্রীয়"। তবে আমরা যদি খালি সংগ্রহস্থল ব্যতীত কাজ করি তবে বিকাশকারীদের একে অপরের কাছ থেকে কেবল টানতে হবে, তবে কখনই চাপ দেবে না। শেষ পরিস্থিতিটি ঠিক ভাল, যদি রেপোগুলির (কেবল স্থানীয় রেপো) কেবল 2 টি ওয়ার্কিং কপি থাকে। এটা কি সঠিক?
আস্তুরিও

60

কিছুক্ষণ আগে যখন আমি এই প্রশ্নটি পড়েছিলাম তখন আমার সবকিছু বিভ্রান্ত করেছিল। আমি কেবল গিট ব্যবহার করতে শুরু করেছি এবং এই ওয়ার্কিং কপিগুলি রয়েছে (যার অর্থ এই সময়ে কিছুই ছিল না)। আমি এই ব্যক্তির দৃষ্টিকোণ থেকে এটি ব্যাখ্যা করার চেষ্টা করব, যিনি পরিভাষা সম্পর্কে কোনও ধারণা ছাড়াই গিট শুরু করেছিলেন।

পার্থক্যের একটি দুর্দান্ত উদাহরণ নিম্নলিখিত উপায়ে বর্ণনা করা যেতে পারে :

--bareআপনাকে কেবল একটি সঞ্চয় স্থান দেয় (আপনি সেখানে বিকাশ করতে পারবেন না)। --bareএটি ছাড়াই আপনাকে সেখানে বিকাশ করার ক্ষমতা দেয় (এবং স্টোরেজ রাখার জায়গা রয়েছে)।

git initআপনার বর্তমান ডিরেক্টরি থেকে গিট সংগ্রহস্থল তৈরি করে। এটি এর ভিতরে .git ফোল্ডার যুক্ত করে এবং এটি আপনার পুনর্বিবেচনার ইতিহাসটি শুরু করা সম্ভব করে।

git init --bareএছাড়াও একটি সংগ্রহস্থল তৈরি করে, তবে এতে কার্যক্ষম ডিরেক্টরি নেই। এর অর্থ হল যে আপনি ফাইলগুলি সম্পাদনা করতে পারবেন না, আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করতে পারবেন, সেই সংগ্রহস্থলটিতে নতুন ফাইল যুক্ত করতে পারবেন।

কখন --bareসহায়ক হতে পারে? আপনি এবং আরও কয়েক জন প্রকল্পে কাজ করছেন এবং গিট ব্যবহার করছেন। আপনি কিছু সার্ভারে প্রকল্পটি হোস্ট করেছেন ( amazon ec2)। আপনার প্রত্যেকের নিজস্ব নিজস্ব মেশিন রয়েছে এবং আপনি আপনার কোডটি টিপুন ec2। আপনার মধ্যে কেউই আসলে কিছুই বিকাশ করে না ec2(আপনি নিজের মেশিনগুলি ব্যবহার করেন) - আপনি কেবল আপনার কোডটি চাপ দিন। সুতরাং আপনার ec2সমস্ত কোডের জন্য এটি আপনার কেবলমাত্র একটি স্টোরেজ এবং আপনার --bareসমস্ত মেশিনগুলি যেমন তৈরি করা উচিত --bare(সম্ভবত সম্ভবত একটি, এবং অন্য কেবল সমস্ত কিছু ক্লোন করে দেবে)। কর্মপ্রবাহটি দেখতে এরকম দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন


1
সুতরাং, আমরা বলতে পারি যে --bare সংগ্রহশালা ব্যবহার করে আমরা একধরনের ক্লায়েন্ট-সার্ভার আর্কিটেকচার তৈরি করতে পারি যেমন সাবভার্সনটি করে?
এমিলিয়ানো সাঙ্গোই

14

একটি ডিফল্ট গিট সংগ্রহস্থল অনুমান করে যে আপনি এটিকে আপনার কার্যক্ষম ডিরেক্টরি হিসাবে ব্যবহার করবেন। সাধারণত, আপনি যখন কোনও সার্ভারে থাকবেন তখন আপনার কার্যকারী ডিরেক্টরি থাকতে হবে না। খালি ভান্ডার। এই ক্ষেত্রে, আপনার --bareবিকল্পটি ব্যবহার করা উচিত ।


--bare বিকল্প সহ একটি রেপোতে, তাই আমরা সমস্ত প্রকল্পের ফাইল দেখতে পাচ্ছি না? দেখে মনে হচ্ছে যে আমি --bare বিকল্পের সাথে আমার সমস্ত প্রকল্পের ফাইলটি হারাচ্ছি ..
কিট হো

11

একটি নন-বেয়ার স্টোর ডিফল্ট। আপনি রান করার সময় এটি তৈরি করা হয় git init, বা bareসার্ভার থেকে ক্লোন ( বিকল্প ছাড়াই ) আপনি কী পাবেন তা you

আপনি যখন এটির মতো কোনও সংগ্রহস্থল নিয়ে কাজ করেন, আপনি সংগ্রহস্থলটিতে থাকা সমস্ত ফাইল দেখতে ও সম্পাদনা করতে পারবেন। আপনি যখন সংগ্রহস্থলের সাথে ইন্টারঅ্যাক্ট করেন - উদাহরণস্বরূপ কোনও পরিবর্তন করে - গিট আপনার পরিবর্তনগুলি ডাকা একটি গোপন ডিরেক্টরিতে সঞ্চয় করে .git

আপনার যখন গিট সার্ভার রয়েছে তখন সেখানে ফাইলগুলির অনুলিপি করার প্রয়োজন নেই। আপনার যা দরকার তা হ'ল সঞ্চিত গিট ডেটা .git। একটি খালি সংগ্রহস্থল হ'ল .gitডিরেক্টরি হ'ল ফাইল সংশোধন ও প্রতিশ্রুতিবদ্ধ করার জন্য কোনও কার্যকারী অঞ্চল ছাড়াই।

আপনি যখন সার্ভার থেকে ক্লোন করেন তখন গিটার কাছে .gitআপনার কার্যকরী অনুলিপি তৈরি করতে ডিরেক্টরিতে প্রয়োজনীয় সমস্ত তথ্য থাকে ।


1

--Bare এবং ওয়ার্কিং ট্রি স্টোরগুলির মধ্যে অন্য একটি পার্থক্য হ'ল প্রথম ক্ষেত্রে কোনও হারানো কমিটস সংরক্ষণ করা হয় না, তবে কেবল শাখা ট্র্যাকের সাথে সম্পর্কিত কমিটগুলি সংরক্ষণ করা হয়। অন্যদিকে, ওয়ার্কিং ট্রি সবকটি কমিটকে চিরকালের জন্য রাখে। নিচে দেখ...

আমি প্রথম সংগ্রহস্থল তৈরি করেছি (নাম: গিট-বেয়ার ) দিয়ে git init --bare। এটি সার্ভার। এটি বাম দিকে, যেখানে কোনও দূরবর্তী শাখা নেই কারণ এটি নিজেই দূরবর্তী সংগ্রহস্থল।

আমি প্রথম থেকে দ্বিতীয় সংগ্রহস্থল (নাম: গিট-ওয়ার্কিং-ট্রি ) তৈরি করেছি git clone। এটা ঠিক এর. এর প্রত্যন্ত শাখাগুলির সাথে সংযুক্ত স্থানীয় শাখা রয়েছে।

('প্রথম', 'দ্বিতীয়', 'তৃতীয়', 'চতুর্থ', 'আলফা', 'বিটা' এবং 'বদ্বীপ' গ্রন্থগুলি শাখার নাম comments 'মাস্টার' এবং 'গ্রীক' নামগুলি শাখার নাম))

স্থানীয় এবং দূরবর্তী সংগ্রহস্থল

এখন আমি গ্রিট-বেয়ার (কমান্ড git push --delete origin greek:) এবং স্থানীয়ভাবে গিট-ওয়ার্কিং-ট্রি (কমান্ড git branch -D greek:) এ 'গ্রীক' নামের শাখাটি মুছব । গাছটি কেমন দেখাচ্ছে তা এখানে:

গিট-বেয়ার রিপোজিটরিটি মুছে যায় যা আর উল্লেখ করা হয় না

Git-বেয়ার সংগ্রহস্থলের উভয় শাখা এবং সব রেফারেন্সড comits মুছে ফেলা হবে। ছবিতে আমরা দেখতে পাচ্ছি যে এর কারণেই এর গাছটি হ্রাস পেয়েছে।

অন্যদিকে, গিট-ওয়ার্কিং-ট্রি রিপোজিটরি, যা সাধারণভাবে ব্যবহৃত স্থানীয় ভাণ্ডারের সমতুল্য, কমিটগুলি মুছে দেয় না, যা এখন কেবল আপনার হ্যাশ দ্বারা সরাসরি একটি git checkout 7fa897b7আদেশ দ্বারা উল্লেখ করা যেতে পারে । যে কারণে এটির গাছের পরিবর্তিত কাঠামো নেই।

ব্রাইফে: কমিটগুলি কখনই ওয়ার্কিং-ট্রি স্টোরগুলিতে ফেলে দেওয়া হয় না , তবে খালি সংগ্রহস্থলে মুছে ফেলা হয় ।

ব্যবহারিক শর্তাবলী, আপনি কেবল সার্ভারে একটি মুছে ফেলা শাখা পুনরুদ্ধার করতে পারেন যদি এটি কোনও স্থানীয় সংগ্রহস্থলে উপস্থিত থাকে।

তবে এটি খুব আশ্চর্যের বিষয় যে কোনও রিমোট শাখাটি মোছার পরে খালি সংগ্রহস্থলের আকার ডিস্ক আকারে হ্রাস পায় না। এটি হ'ল ফাইলগুলি এখনও একরকম রয়েছে। রেফারেন্সির ডাম্প করার জন্য যা আর রেফারেন্স হয় না বা যা কখনই রেফারেন্স করা যায় না তা মুছে ফেলা (পরবর্তী ক্ষেত্রে) git gc --pruneকমান্ডটি ব্যবহার করুন


গিট কমান্ড পরীক্ষা করতে চেষ্টা করুন: github.com/sergiocabral/App.GitPlayground
সেরজিও ক্যাব্রাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.