আপনি কীভাবে একাধিক গিট সংগ্রহস্থলগুলি সংগঠিত করেন, যাতে সেগুলির সমস্ত এক সাথে ব্যাক আপ হয়?


98

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

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

মূলত, আমি আমার সমস্ত কোড (কেবলমাত্র প্রকল্পগুলি নয়, তবে এলোমেলো স্নিপেটস এবং স্ক্রিপ্টস, আমার সিভি এর মতো কিছু জিনিস, আমার লেখা নিবন্ধসমূহ, আমি যে ওয়েবসাইটগুলি তৈরি করেছি এবং এরকম) একটি বড় সংগ্রহস্থলে আমি সহজেই রিমোটে ক্লোন করতে পারি ব্যাকআপ হিসাবে মেশিন বা মেমরি স্টিক / হার্ডড্রাইভ as

সমস্যাটি হ'ল এটি একটি ব্যক্তিগত সংগ্রহস্থল এবং গিটটি নির্দিষ্ট ফোল্ডারটি পরীক্ষা করতে দেয় না (যে আমি পৃথক প্রকল্প হিসাবে গিথুবকে ঠেলে দিতে পারি, তবে মাস্টার-রেপো এবং সাব-উভয় ক্ষেত্রেই পরিবর্তনগুলি উপস্থিত হতে পারে) repos)

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

বর্তমানে আমার কাছে গিট-রেপোসের একটি ফোল্ডার রয়েছে (উদাহরণস্বরূপ, ~ / code_projects / proj1 / .git / ~ / code_projects / proj2 / .git /), এবং আমি প্রজ 1 এ পরিবর্তনগুলি করার git push githubপরে আমি ফাইলগুলি copy / এ অনুলিপি করছি ডকুমেন্টস / কোড / পাইথন / প্রকল্প / প্রজ 1 / এবং একটি একক প্রতিশ্রুতিবদ্ধ (পৃথক রেপোতে অসংখ্য লোকের পরিবর্তে)। তারপর git push backupdrive1, git push mymemorystickইত্যাদি

সুতরাং, প্রশ্ন: গিট সংগ্রহস্থলগুলির সাহায্যে আপনার ব্যক্তিগত কোড এবং প্রকল্পগুলি কীভাবে হয় এবং সেগুলিকে সিঙ্ক এবং ব্যাক আপ রাখে?

উত্তর:


74

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

এই ধারণার লড়াইয়ের অর্থ অহেতুক জট বাঁধার ইতিহাসের সমাপ্তি, যা প্রশাসনকে আরও কঠিন এবং আরও গুরুত্বপূর্ণভাবে - "প্রত্নতত্ত্ব" সরঞ্জামগুলিকে ফলস্বরূপ হ্রাসের কারণে কম কার্যকর উপস্থাপন করে। এছাড়াও, যেমনটি আপনি উল্লেখ করেছেন, গিত ধরে নিয়েছে যে "ক্লোনিংয়ের একক" ভাণ্ডার, এবং বিতরণকৃত প্রকৃতির কারণে ব্যবহারিকভাবে এটি করতে হবে।

একটি সমাধান হ'ল প্রতিটি প্রকল্প / প্যাকেজ / ইত্যাদি রাখা। আশীর্বাদযুক্ত শ্রেণিবদ্ধের অধীনে এর নিজস্ব খালি সংগ্রহস্থল হিসাবে (অর্থাত্ বৃক্ষবিহীন বৃক্ষ হিসাবে) যেমন:

/repos/a.git
/repos/b.git
/repos/c.git

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

svn checkout   --> git clone
svn update     --> git pull
svn commit     --> git push

একাধিক পক্ষের মধ্যে সিঙ্ক্রোনাইজ করার স্বাচ্ছন্দ্যের জন্য আপনার প্রতিটি কার্যকরী ক্লোনায় একাধিক রিমোট থাকতে পারে:

$ cd ~/dev
$ git clone /repos/foo.git       # or the one from github, ...
$ cd foo
$ git remote add github ...
$ git remote add memorystick ...

তারপরে আপনি প্রতিটি "উত্স" থেকে আনা / টানতে পারেন, স্থানীয়ভাবে কাজ করতে এবং প্রতিশ্রুতিবদ্ধ করতে পারেন, এবং তারপরে আপনি যখন প্রস্তুত কিছু তৈরি করেন তখন এই প্রত্যন্ত প্রত্যেকে ("ব্যাকআপ") টিপুন (নোটটি কীভাবে একই প্রতিশ্রুতি দেয় এবং ইতিহাসকে কীভাবে চাপ দেয় তা নোট করুন) প্রত্যন্ত প্রত্যেকে!):

$ for remote in origin github memorystick; do git push $remote; done

বিদ্যমান ওয়ার্কিং রিপোজিটরিগুলিকে এ ~/dev/foo জাতীয় খালি ভাণ্ডারে পরিণত করার সহজতম উপায় সম্ভবত:

$ cd ~/dev
$ git clone --bare foo /repos/foo.git
$ mv foo foo.old
$ git clone /repos/foo.git

যা বেশিরভাগই একটি svn import- তবে সমতুল্য , "স্থানীয়" ইতিহাসকে ফেলে দেয় না।

দ্রষ্টব্য: সাবমডিউলগুলি ভাগ করে নেওয়া সম্পর্কিত বংশগুলিকে অন্তর্ভুক্ত করার একটি প্রক্রিয়া , তাই আপনি যে সমস্যার সমাধান করার চেষ্টা করছেন তার পক্ষে আমি তাদের যথাযথ সরঞ্জাম হিসাবে বিবেচনা করব না।


18
এগুলি পরিচালনা করতে সহায়তার জন্য আমি প্রচুর পৃথক সংগ্রহস্থল এবং সহজ স্ক্রিপ্টগুলি লিখে রাখার বিষয়টি আমাকে অনুভব করে যে গিটের মধ্যে কিছু অনুপস্থিত রয়েছে। আমি ঠিক এটি কী বা এটি সম্পর্কে কী করতে হবে ঠিক করতে পারছি না।
ডোনগার

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

4
এই ধারণাটি তখনই বোধগম্য হয় যদি আপনি নিজের প্রকল্পগুলি হোস্ট করেন এবং / অথবা সেগুলি সমস্ত ওপেন সোর্স। অন্যথায় আপনার
গিথুবের

4
"রিমোট ইন অরিজিনের গিথুব মেমরিস্টিকের পরিবর্তে; গিট পুশ $ রিমোট; সম্পন্ন" এর পরিবর্তে, একসাথে অনেক রিমোটগুলিতে একক কমান্ডের সাহায্যে বিশেষ দূরবর্তীটি কনফিগার করা যায়: স্ট্যাকওভারফ্লো / প্রশ্ন / 68686262২/২ । (কিছু ক্ষেত্রে আরও সুবিধাজনক হতে পারে))
ইম্জ - ইভান জ্যাকারিয়াশেভ

4
আমি মনে করি যে অনুপস্থিত জিনিসটি এমন একটি উপায় যা গিটটি সাবট্রি দ্বারা পৃথক পৃথক জিনিস রাখতে পারে যাতে একটি একক "সংগ্রহস্থল" পৃথক সিঙ্ক্রোনাইজড হয়ে যায় যদিও পৃথকযোগ্য ইউনিট (বিশ্রাম ব্যতীত পৃথকভাবে ডাউনলোড করা হয়) এমনভাবে যাতে লোকেরা নির্দিষ্ট কাজ করতে পারে এটির বাকিগুলি সম্পর্কে না জেনে সাবসেটগুলি।
পিটার্ক

28

আমি ড্যামিয়েনের উত্তরটিতে যুক্ত করতে চাই যেখানে তিনি সুপারিশ করেছেন:

$ for remote in origin github memorystick; do git push $remote; done

আপনি 1 কমান্ডের সাহায্যে সমস্ত স্বতন্ত্র রিমোটগুলিতে চাপ দিতে একটি বিশেষ রিমোট সেট আপ করতে পারেন; আমি এটি http://marc.info/?l=git&m=116231242118202&w=2 এ পেয়েছি :

সুতরাং "গিট পুশ" (যেখানে একই শাখাগুলিকে একাধিকবার চাপ দেওয়ার বুদ্ধি ঘটে) এর জন্য, আমি আসলে যা করতে পারি তা করতে পারেন:

  • .git / কনফিগারেশনে রয়েছে:

    [remote "all"]
    url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
    url = login.osdl.org:linux-2.6.git
    
  • এবং এখন remote দূরবর্তী সংগ্রহস্থল উভয়েরইgit push all master "মাস্টার" শাখাটি ঠেলে দেবে ।

আপনি দুটি বার ইউআরএল টাইপ করে কনট্রাকশন ব্যবহার করে বাঁচাতে পারবেন:

[url "<actual url base>"]
    insteadOf = <other url base>

3

আমি এটি পরিচালনা করার জন্য প্রস্তাবিত উপায়গুলি সম্পর্কেও কৌতূহলী এবং আমি যে বর্তমান সেটআপটি ব্যবহার করব তা বর্ণনা করব (এসভিএন সহ)। আমি মূলত একটি ভান্ডার তৈরি করেছি যার মধ্যে একটি মিনি-ফাইল সিস্টেম হায়ারার্কি রয়েছে যার মধ্যে তার নিজস্ব বিন এবং লিব ডায়ার রয়েছে। এই গাছের গোড়ায় এমন স্ক্রিপ্ট রয়েছে যা আপনার পরিবেশকে এই বিন, লিব ইত্যাদি যোগ করার জন্য সেটআপ করবে ... সঠিক পরিবেশের ভেরিয়েবলগুলিতে অন্যান্য ডায়ার। সুতরাং মূল ডিরেক্টরিটি মূলত:

./bin/            # prepended to $PATH
./lib/            # prepended to $LD_LIBRARY_PATH
./lib/python/     # prepended to $PYTHONPATH
./setup_env.bash  # sets up the environment

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

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


3

, আমি এখনও গিট সংগ্রহস্থল নেস্ট করার চেষ্টা করি নি কারণ আমার এমন পরিস্থিতিতে পড়েনি যা আমার প্রয়োজন। আমি যেমন # গিট চ্যানেলে পড়েছি গীটটি ভাণ্ডারগুলি বাসা বেঁধে দেখে মনে হচ্ছে বিভ্রান্ত হয়ে পড়েছে, অর্থাত আপনি গিট সংগ্রহস্থলের ভিতরে গিট-ইন করার চেষ্টা করছেন। নেস্টেড গিট স্ট্রাকচার পরিচালনা করার একমাত্র উপায় হ'ল হয় git-submoduleঅ্যান্ড্রয়েডের repoইউটিলিটি।

সেই ব্যাকআপ দায়টি হিসাবে আপনি যা বর্ণনা করছেন আমি বলছি এটি ডেলিগেট করুন ... আমার জন্য আমি সাধারণত প্রতিটি প্রকল্পের জন্য "অরিজিন" সংগ্রহস্থলটি কার্যত এমন একটি নেটওয়ার্ক ড্রাইভে রাখি যা আইটি-টেকগুলি তাদের ব্যাকআপ কৌশল দ্বারা নিয়মিত ব্যাক আপ করে থাকে পছন্দ এটি সহজ এবং আমাকে এটি নিয়ে চিন্তা করতে হবে না। ;)


2

আপনার একাধিক গিট রেপো একবারে পরিচালনা করার জন্য মিঃ ব্যবহার সম্পর্কে কী :

এমআর (1) কমান্ডটি সংগ্রহস্থলগুলির সেটগুলিতে চেকআউট, আপডেট করতে বা অন্যান্য ক্রিয়াকলাপ সম্পাদন করতে পারে যেন তারা একক সম্মিলিত রিপোসিটোরি। এটি সাবভারশন, গিট, সিভিএস, মার্উরিয়াল, বিজেআর, ডার্কস, সিভিএস, ভিসিএস, জীবাশ্ম এবং সত্যিকারের সংগ্রহস্থলগুলির যে কোনও সংমিশ্রণকে সমর্থন করে এবং অন্যান্য সংশোধন নিয়ন্ত্রণ সিস্টেমের জন্য সমর্থন সহজেই যুক্ত করা যায়। [...]

এটি সাধারণ শেল স্ক্রিপ্টিংয়ের মাধ্যমে অত্যন্ত কনফিগারযোগ্য। এটি করতে পারে এমন কিছু উদাহরণের মধ্যে রয়েছে:

[...]

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

1

নেস্টেড গিট রিপোস রাখার জন্য আরও একটি পদ্ধতি রয়েছে তবে এটি আপনার পরে সমস্যাটি সমাধান করে না। তবুও, অন্যদের জন্য যারা সমাধানের সন্ধান করছেন আমি ছিলাম:

শীর্ষ স্তরের গিট রেপোতে কেবল নীস্টেড গিট রেপো সম্বলিত .gitignore ফোল্ডারটি লুকান। এটি দুটি পৃথক (তবে নেস্টেড!) গিট রেপো রাখা সহজ করে তোলে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.