অগভীর গিট সাবমডিউলগুলি কীভাবে তৈরি করবেন?


139

অগভীর সাবমডিউলগুলি রাখা কি সম্ভব? আমার বেশ কয়েকটি সাবমডিউল রয়েছে যার একটি দীর্ঘ ইতিহাস রয়েছে এবং এটি একটি অজস্রভাবে বড় হয়ে যায় that সমস্ত ইতিহাসকে টেনে নিয়ে যায়।

আমি যা কিছু পেয়েছি তা হ'ল এই অনুत्तरযুক্ত থ্রেড

এটিকে বাস্তবায়নের জন্য আমার কি গিট-সাবমডুল হ্যাক করা উচিত ?


1
" git submodule add/update" এখন অল্প স্বল্পভাবে সাবমডিউল সংগ্রহস্থলগুলি ক্লোন করতে পারে! দেখুন নিচের আমার উত্তর
VonC

উত্তর:


133

আসন্ন git1.8.4 এ নতুন (জুলাই 2013) :

" git submodule update" বিকল্পভাবে সাবমডিউল সংগ্রহস্থলগুলিকে অল্প পরিমাণে ক্লোন করতে পারে।

(এবং Git 2.10 চতুর্থাংশ 3 2016 রেকর্ড করতে যে সঙ্গে পারবেন git config -f .gitmodules submodule.<name>.shallow true
এই উত্তরটি শেষে দেখুন)

কমিট 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f দেখুন :

যোগ --depth"Git submodule" যা পরে ক্লোন কমান্ড কাছে হস্তান্তর করা হয় অ্যাড এবং আপডেট কমান্ড করার অপশন। সাবমোডুল (গুলি) বিশাল হয় এবং আপনি সর্বশেষ প্রতিশ্রুতি ব্যতীত অন্য কোনও বিষয়ে আগ্রহী নন যখন এটি কার্যকর।

পরীক্ষাগুলি যোগ করা হয় এবং "সাবমডিউল আপডেট পিডাব্লুডিতে প্রতীকী লিঙ্কগুলি পরিচালনা করতে পারে" তে টেস্টফিলের বাকী অংশের সাথে সামঞ্জস্য করার জন্য কিছু ইনডেনশন সমন্বয় করা হয়েছিল।

সাইন-অফ-বাই: ফ্রেড্রিক গুস্তাফসন <iveqy@iveqy.com>
আকিড-বাই: জেনস লেহম্যান<Jens.Lehmann@web.de>

এর অর্থ এই কাজ করে:

git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]

সঙ্গে:

--depth::

এই বিকল্পটি জন্য বৈধ addএবং updateকমান্ড।
নির্দিষ্ট সংখ্যার সংশোধিত সংখ্যায় কাটা ইতিহাস সহ একটি 'অগভীর' ক্লোন তৈরি করুন।


অ্যাটুইম্যান মন্তব্যগুলিতে যোগ করেছেন :

যতদূর আমি বলতে পারি এই বিকল্পটি সাবমোডিয়ুলগুলির জন্য ব্যবহারযোগ্য নয় যা masterখুব ঘনিষ্ঠভাবে ট্র্যাক করে না। আপনি যদি গভীরতা 1 সেট করে থাকেন তবে submodule updateকেবল তখনই সফল হতে পারে যদি আপনি চান সাবমডিউল প্রতিশ্রুতি সর্বশেষতম মাস্টার। অন্যথায় আপনি " fatal: reference is not a tree" পাবেন

ঐটা সত্য.
এটি, গিট 2.8 (মার্চ 2016) অবধি। ২.৮ সহ, submodule update --depthসাফল্যের আরও একটি সুযোগ রয়েছে, এমনকি SHA1 রিমোট রেপো হেডগুলির মধ্যে যে কোনও একটি থেকে সরাসরি পৌঁছানো যায়।

দেখুন কমিট fb43e31 (24 ফেব্রুয়ারী 2016) দ্বারা স্টিফান Beller ( stefanbeller)
সহায়তায়: জুনিও সি হামানো ( gitster)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 9671a76 26 ফেব্রুয়ারী 2016)

সাব-মডিউল: সরাসরি শ -1 এনে প্রয়োজনীয় sha1 আনার জন্য আরও চেষ্টা করুন

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

যদি $sha1ডিফল্ট আনার অংশ না হয় তবে আমরা $sha1সরাসরি আনার চেষ্টা করি । কিছু সার্ভার অবশ্য sha1 দ্বারা সরাসরি আনয়ন সমর্থন করে না, যা git-fetchদ্রুত ব্যর্থ হওয়ার দিকে নিয়ে যায় ।
আমরা এখানে নিজেকে ব্যর্থ করতে পারি যেহেতু এখনও অনুপস্থিত sha1 যাইহোক চেকআউট পর্যায়ে পরে ব্যর্থতার দিকে পরিচালিত করতে পারে, সুতরাং এখানে ব্যর্থ হওয়া যতটা সম্ভব আমরা পেতে পারি।


MVG তুলে ধরে মন্তব্য করতে কমিট fb43e31 (Git 2.9, ফেব্রুয়ারি 2016)

এটি আমার কাছে মনে হবে যে প্রতিশ্রুতিবদ্ধ fb43e31 SHA1 আইডি দ্বারা অনুপস্থিত প্রতিশ্রুতিটি অনুরোধ করে, তাই সার্ভারে থাকা সেটিংস uploadpack.allowReachableSHA1InWantএবং uploadpack.allowTipSHA1InWantসেটিংস সম্ভবত এটি প্রভাবিত করবে কিনা।
আমি আজ গিট তালিকায় একটি পোস্ট লিখেছি , কিছু দৃশ্যের জন্য কীভাবে অগভীর সাবমডিউলগুলি আরও ভালভাবে কাজ করা যেতে পারে তা নির্দেশ করে, যেমন প্রতিশ্রুতিবদ্ধতাও যদি ট্যাগ হয় tag
অপেক্ষা করুন এবং দেখুন।

আমি অনুমান করি যে এটি কারণ হ'ল fb43e31 নির্দিষ্ট SHA1 এর জন্য ডিফল্ট শাখার জন্য আনার পরে একটি ফ্যালব্যাক তৈরি করেছিল।
তবুও, "--depth 1" এর ক্ষেত্রে আমি মনে করি যে তাড়াতাড়ি বাতিল করা অর্থহীন হবে: যদি তালিকাভুক্ত রেফগুলির কোনওটিই অনুরোধ করাটির সাথে মেলে না, এবং SHA1 দ্বারা জিজ্ঞাসা করা সার্ভার দ্বারা সমর্থিত না হয়, তবে এতে কোনও লাভ নেই যে কোনও কিছু উপস্থাপিত হচ্ছে, যেহেতু আমরা উপমন্ডলের প্রয়োজনীয়তা কোনওভাবেই পূরণ করতে সক্ষম হব না।


আগস্ট 2016 আপডেট করুন (3 বছর পরে)

গিট 2.10 (Q3 2016) এর সাহায্যে আপনি করতে সক্ষম হবেন

 git config -f .gitmodules submodule.<name>.shallow true

আরও জন্য " অতিরিক্ত ওজন ছাড়াই গিট সাবমডিউল " দেখুন।


গিট 2.13 ( কিউ 2 2017) সেবাস্তিয়ান sschuberthশুবারথ () দ্বারা 8d3047c (19 এপ্রিল 2017 ) এর প্রতিশ্রুতিবদ্ধ করুন
(দ্বারা একীভূত সেবাস্টিয়ান Schuberth - sschuberth- মধ্যে 8d3047c কমিট , 20 এপ্রিল 2017)

এই সাবমডিউলের একটি ক্লোনটি অগভীর ক্লোন হিসাবে সম্পাদিত হবে (1 এর ইতিহাস গভীরতার সাথে)

যাইহোক, সিরো Santilli যোগ মন্তব্য (এবং বিবরণ তার উত্তরে )

shallow = trueউপর .gitmodulesশুধুমাত্র প্রভাবিত রেফারেন্স যখন ব্যবহার করে দূরবর্তী প্রধান দ্বারা ট্র্যাক --recurse-submodules, লক্ষ্য কমিট এমনকি যদি একটি শাখা দ্বারা প্রতি ইঙ্গিত করা হয়, এবং এমনকি যদি আপনি করা branch = mybranchউপর .gitmodulesহিসাবে ভাল।


গিট ২.২০ (Q4 2018) সাবমডিউল সহায়তাটিতে উন্নতি করে, HEAD:.gitmodulesযখন .gitmodulesকার্যক্ষম গাছ থেকে ফাইলটি নিখোঁজ হয় তখন ব্লব থেকে পড়তে আপডেট করা হয়েছে ।

দেখুন 2b1257e কমিট , 76e9bdc কমিট (25 অক্টোবর 2018), এবং b5c259f কমিট , 23dd8f5 কমিট , b2faad4 কমিট , 2502ffc কমিট , 996df4d কমিট , d1b13df কমিট , 45f5ef3 কমিট , কমিট bcbc780 (05 অক্টোবর 2018) দ্বারা আন্তোনিও Ospite ( ao2)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে abb4824 কমিট , 13 নভেম্বর 2018)

submodule: .gitmodulesযখন কার্যক্ষম গাছের মধ্যে না থাকে তখন পড়া সমর্থন করুন

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

এটি কমপক্ষে ' git submodule' 'কমান্ডগুলি ব্যবহার করা সম্ভব করে যা কার্যকরী গাছকে সম্পূর্ণরূপে পপুলেশন না করে কনফিগারেশন ফাইলটি পড়েgitmodules

লেখার জন্য .gitmodulesএখনও ফাইলটি চেক আউট করা দরকার, সুতরাং কল করার আগে এটি পরীক্ষা করে দেখুন config_set_in_gitmodules_file_gently

git-submodule.sh::cmd_add()" git submodule add" .gitmodulesনিরাপদে লিখনযোগ্য নয় যখন কমান্ডের চূড়ান্ত ব্যর্থতা অনুমান করতে অনুরূপ চেক যুক্ত করুন ; এটি কমান্ডটিকে উত্সাহজনক অবস্থায় সংগ্রহস্থল ছাড়তে বাধা দেয় (উদাহরণস্বরূপ সাবমডিউল সংগ্রহস্থলটি ক্লোন করা .gitmodulesহয়েছিল তবে config_set_in_gitmodules_file_gentlyব্যর্থ হওয়ার কারণে আপডেট হয়নি)।

এছাড়াও, যেহেতু config_from_gitmodules()এখন গ্লোবাল অবজেক্ট স্টোরটি অ্যাক্সেস করে, তাই সমস্ত কোড পন্থাগুলি রক্ষা করা প্রয়োজন যা গ্লোবাল অবজেক্ট স্টোরের একযোগে অ্যাক্সেসের বিরুদ্ধে ফাংশনটিকে ডাকে।
বর্তমানে এটি কেবল এতে ঘটে থাকে builtin/grep.c::grep_submodules(), সুতরাং grep_read_lock()কোড জড়িত হওয়ার আগে কল করুন config_from_gitmodules()

দ্রষ্টব্য: এমন একটি বিরল কেস আছে যেখানে এই নতুন বৈশিষ্ট্যটি এখনও সঠিকভাবে কাজ করে না: .gitmodulesতাদের কার্যক্ষম গাছ ছাড়া নেস্টেড সাবমডিউলগুলি ।


দ্রষ্টব্য: গিট 2.24 (Q4 2019) একটি সাবমডিউল অগভীর ক্লোনিং করার সময় একটি সম্ভাব্য সেগফল্ট ঠিক করে।

আলী উত্কু সেলেন ( ) দ্বারা কমিট ডিডিবি 3 সি 85 (30 সেপ্টেম্বর 2019 ) দেখুন(দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট 678a9ca , 09 অক্টোবর 2019)auselen
gitster


গিট 2.25 (কিউ 12020), git submodule updateডকুমেন্টেশন পরিষ্কার করে ।

দেখুন f0e58b3 কমিট দ্বারা (24 নভেম্বর 2019) ফিলিপ Blain ( phil-blain)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট ef61045 , 05 ডিসেম্বর 2019)

doc: উল্লেখ করুন যে 'গিট সাবমডিউল আপডেট' অনুপস্থিত কমিটগুলি আনে

হেল্প-বাই: জুনিও সি হামানো
হেল্প-বাই: জোহানেস শিন্ডেলিন
সই-অফ-বাই: ফিলিপ ব্লেইন

সুপারপজেক্টে রেকর্ডকৃত SHA-1 সন্ধান না পাওয়া গেলে ' git submoduleআপডেট' সাবমোডিয়াল রিমোট থেকে নতুন কমিটগুলি আনবে । ডকুমেন্টেশনে এটি উল্লেখ করা হয়নি।


সতর্কতা: গিট 2.25 (কিউ 12020) এর সাথে, " git clone --recurse-submodules" এবং বিকল্প অবজেক্ট স্টোরের মধ্যে মিথস্ক্রিয়াটি অ-নকশাকৃত ছিল।

ব্যবহারকারীরা যখন ব্যর্থতা দেখেন তখন ডকুমেন্টেশন এবং কোডটিকে আরও স্পষ্ট সুপারিশ করতে শেখানো হয়েছিল।

কমিট 4f3e57e দেখুন , প্রতিশ্রুতিবদ্ধ 10c64a0 (02 ডিসেম্বর 2019) জোনাথন টান ( jhowtan) দ্বারা
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 5dd1d59 , 10 ডিসেম্বর 2019)

submodule--helper: মারাত্মক বিকল্প ত্রুটি সম্পর্কে পরামর্শ

সাইন-অফ-বাই: জনাথন টান
আকিড-বাই: জেফ কিং

যখন .gitmodulesঅগভীরভাবে কোনও অল্প অগভীর মডিউলগুলি সংজ্ঞায়িত করে একটি সুপারপ্রজেক্টকে ক্লোনিং করা হয় , তারপরে " --reference=<path>" সাথে পুনরায় সংযুক্তি ঘটে তখন একটি ত্রুটি ঘটে। উদাহরণ স্বরূপ:

git clone --recurse-submodules --branch=master -j8 \
  https://android.googlesource.com/platform/superproject \
  master
git clone --recurse-submodules --branch=master -j8 \
  https://android.googlesource.com/platform/superproject \
  --reference master master2

এর সাথে ব্যর্থ:

fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow

যখন সুপারপ্রজেক্টের বিকল্প থেকে কোনও বিকল্প গণনা যুক্ত করা যায় না, এই ক্ষেত্রে বা অন্য কোনও ক্ষেত্রে, submodule.alternateErrorStrategyকনফিগারেশন বিকল্পটি কনফিগার করার এবং ক্লোনিং করার সময় " --reference-if-able" পরিবর্তে " " ব্যবহার করার পরামর্শ দিন --reference

এটি বিস্তারিত:

গিট 2.25 (কিউ 12020) এর সাথে, "গিট ক্লোন --recurse-submodules" এবং বিকল্প অবজেক্ট স্টোরের মধ্যে মিথস্ক্রিয়াটি অ-নকশাকৃত ছিল।

Doc: submodule.alternateErrorStrategy ব্যাখ্যা করুন

সাইন-অফ-বাই: জনাথন টান
আকিড-বাই: জেফ কিং

কমিট 31224cbdc7 ( " clone: Recursive এবং রেফারেন্স বিকল্প ট্রিগার submodule বিকল্পসমূহ", 2016-08-17, গীত v2.11.0-rc0 - একত্রীকরণ তালিকাভুক্ত ব্যাচ # 1 ) কনফিগারেশন বিকল্পগুলি "সমর্থন করার জন্য গীত শেখানো submodule.alternateLocation" এবং " submodule.alternateErrorStrategyএকটি superproject এ" ।

যদি সুপারপোজেক্টে submodule.alternateLocation" superproject" " " তে কনফিগার করা থাকে , যখনই super সুপারপ্রজেক্টের একটি সাবমডিউল ক্লোন করা হয়, এটি পরিবর্তে সুপারপোজেক্টের সেই সাবমোডিয়ুলের জন্য অভিন্ন বিকল্প পথকে গণনা করে $GIT_DIR/objects/info/alternatesএবং এটি উল্লেখ করে।

" submodule.alternateErrorStrategy" বিকল্পটি স্থির করে যদি সেই বিকল্পটি উল্লেখ করা না যায় তবে কী ঘটে।
তবে এটি স্পষ্ট নয় যে ক্লোনটিটি এমনভাবে প্রবাহিত হয়েছে যখন বিকল্পটি নির্দিষ্ট করা হয়নি যখন সেই বিকল্পটি "ডাই" তে সেট করা থাকে না (যেমন পরীক্ষাগুলিতে 31224cbdc7 তে দেখা যায় )।
অতএব, সেই অনুযায়ী এটি নথি।

কনফিগ submodule ডকুমেন্টেশন এখন রয়েছে:

submodule.alternateErrorStrategy::

উল্লেখ করে কিভাবে যেমন মাধ্যমে নির্ণিত একটি submodule জন্য বিকল্পসমূহ সঙ্গে ত্রুটি চিকিত্সা submodule.alternateLocation
সম্ভাব্য মান হল ignore, info, die
ডিফল্ট হয় die
মনে রাখবেন যে সেট করা থাকলে ignoreবা info, এবং যদি গণিত বিকল্পের সাথে কোনও ত্রুটি থাকে, ক্লোনটি এমনভাবে এগিয়ে যায় যেন কোনও বিকল্প নির্দিষ্ট করা হয়নি


2
বাহ যে দ্রুত ছিল! উপায় দ্বারা উত্তর জন্য Thx। ওহ এবং --depthচিৎকারও একটি যুক্তি নিন;)
ব্রাইস

3
এটি আমার কাছে মনে হবে যে প্রতিশ্রুতিবদ্ধ fb43e31 SHA1 আইডি দ্বারা অনুপস্থিত প্রতিশ্রুতিটি অনুরোধ করে, তাই সার্ভারে থাকা সেটিংস uploadpack.allowReachableSHA1InWantএবং uploadpack.allowTipSHA1InWantসেটিংস সম্ভবত এটি প্রভাবিত করবে কিনা। আমি আজ গিট তালিকায় একটি পোস্ট লিখেছি , কিছু দৃশ্যের জন্য কীভাবে অগভীর সাবমডিউলগুলি আরও ভালভাবে কাজ করা যেতে পারে তা নির্দেশ করে, যেমন প্রতিশ্রুতিবদ্ধতাও যদি ট্যাগ হয় tag অপেক্ষা করুন এবং দেখুন।
এমভিজি

2
ইন অগভীর বিকল্পের সাম্প্রতিক সংযোজনের সাথে .gitmodules, --depth 1বিকল্পটি কী শাখাগুলির জন্য কাজ করে যা মাস্টারকে নিবিড়ভাবে অনুসরণ করে না?
সিএমসিডিগ্রাগনকাই

2
@ সিরোস্যান্টিলি 刘晓波 iro 六四 事件 法轮功 নির্ভুলতা এবং পরীক্ষার জন্য আপনাকে ধন্যবাদ। আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি এবং আপনার উত্তরটিকে উজ্জীবিত করেছি।
ভনসি

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

26

গিট ২.৯.০ সাপোর্ট সাবমোডিয়ুলগুলি অগভীর ক্লোনটি সরাসরি, সুতরাং এখন আপনি কেবল কল করতে পারেন:

git clone url://to/source/repository --recursive --shallow-submodules

2
এই বিকল্পটি প্রতিশ্রুতিময়, কিন্তু এটা Git 2.14.1 submodule ব্যর্থ হলে কমিট হয় একটি শাখা বা ট্যাগ দ্বারা ট্র্যাক নয়: stackoverflow.com/a/47374702/895245
সিরো Santilli郝海东冠状病六四事件法轮功

1
@ সিরোস্যান্টিলি 刘晓波 死 六四 事件 your আপনার গিট সার্ভারটিও আপডেট হয়েছে তা নিশ্চিত করুন
KindDragon

ধন্যবাদ, আমি স্থানীয়ভাবে সার্ভার ছাড়াই এবং গিটহাবের উপর পরীক্ষা করেছি, যা আমি আপডেট করতে পারি না :-)
সিওরো সান্তিলি 19 冠状 病 六四 事件 法轮功

1
গিট ২.২০ ব্যবহার করে আমার একই সমস্যা রয়েছে, যখন সাবমডিউল শাখার ডগায় নেই তখন এটি কাজ করে না।
Zitrax

16

রায়ের উত্তর অনুসরণ করে আমি এই সহজ স্ক্রিপ্টটি নিয়ে আসতে সক্ষম হয়েছি যা সমস্ত সাবমোডিউল এবং অগভীর ক্লোনগুলির মাধ্যমে পুনরাবৃত্তি করে:

#!/bin/bash
git submodule init
for i in $(git submodule | sed -e 's/.* //'); do
    spath=$(git config -f .gitmodules --get submodule.$i.path)
    surl=$(git config -f .gitmodules --get submodule.$i.url)
    git clone --depth 1 $surl $spath
done
git submodule update

আমি fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349dfপ্রতিটি
উপ


1
@ ননকোতে: আমি আমার উত্তরটি ২০১০ সালে লিখেছি Th আপনি প্রত্যেকে তাদের সমস্ত উত্তর বজায় রাখার আশা করতে পারবেন না। আমি গ্রহণযোগ্য হিসাবে বর্তমান বৈধ উত্তর চিহ্নিত করেছি।
মৌরিসিও শেফার

13
@ Knocte স্ট্যাকওভারফ্লোতে অবদান বন্ধ করার কারণগুলির মধ্যে এটি একটি। মানুষের এই অবাস্তব প্রত্যাশা রয়েছে। আমার ১37 answers37 টি উত্তর উত্তর রক্ষণাবেক্ষণ করা পুরো সময়ের কাজ হবে। এবং তারপরে মন্তব্যগুলিও রয়েছে, আমি মনে করি আমাকে সেগুলিও বজায় রাখতে হবে? তারিখগুলি একবার দেখুন, তাদের জন্য এটি। আপনি যদি 2002 এর তালিকা অনুসারে অ্যারেলিস্ট ব্যবহার করে কোড সহ কিছু নেট নেট পড়েন তবে আপনি কি এটি ব্যবহার করবেন? আপনি কি দাবি করবেন যে লেখক তার পোস্ট আপডেট করেছেন? একই নীতি এখানে প্রযোজ্য।
মৌরিসিও শেফার 20'14

1
এস / স্ট্যাটাস / অগ্রগতি /
নট করুন

8

গিট-সাবমডিউল "উত্স" এর মাধ্যমে পড়া দেখে মনে হচ্ছে এমন git submodule addসাবমোডিয়ালগুলি হ্যান্ডেল করতে পারে যা ইতিমধ্যে তাদের সংগ্রহস্থলগুলি উপস্থিত রয়েছে। এই ক্ষেত্রে...

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
$ git submodule add $remotesub1 $sub1
#repeat as necessary...

আপনি সাবডমডিউল রেপোতে প্রয়োজনীয় কমিটমেন্ট রয়েছে তা নিশ্চিত করতে চাইবেন, সুতরাং আপনি একটি উপযুক্ত - ডেপথ সেট করেছেন তা নিশ্চিত করুন।

সম্পাদনা করুন: আপনি একক আপডেটের পরে একাধিক ম্যানুয়াল সাবমডিউল ক্লোনগুলি নিয়ে পালাতে সক্ষম হতে পারেন:

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
#repeat as necessary...
$ git submodule update

5
এখন গিট ১.৮.০ এর জন্য, আপনি আর কোনও সংগ্রহস্থলের অভ্যন্তরে কোনও সংগ্রহস্থল ক্লোন করতে পারবেন না। সুতরাং এই সমাধান আর কাজ করে না।
বোহর

7

গিট 2.14.1 হিসাবে বগি / অপ্রত্যাশিত / বিরক্তিকর আচরণের সংক্ষিপ্তসার

  1. shallow = trueমধ্যে .gitmodulesশুধুমাত্র প্রভাবিত git clone --recurse-submodulesযদি HEADপ্রয়োজন বোধ করা দূরবর্তী submodule পয়েন্ট কমিট, লক্ষ্য কমিট এমনকি যদি একটি শাখা দ্বারা প্রতি ইঙ্গিত করা হয়, এবং আপনি করা এমনকি যদি branch = mybranchউপর .gitmodulesহিসাবে ভাল।

    স্থানীয় পরীক্ষার স্ক্রিপ্ট । গিটহাব 2017-11 এ একই আচরণ, যেখানে HEADডিফল্ট শাখা রেপো সেটিং দ্বারা নিয়ন্ত্রিত হয়:

    git clone --recurse-submodules https://github.com/cirosantilli/test-shallow-submodule-top-branch-shallow
    cd test-shallow-submodule-top-branch-shallow/mod
    git log
    # Multiple commits, not shallow.
    
  2. git clone --recurse-submodules --shallow-submodulesবিফল হয় কমিট তন্ন তন্ন একটি শাখা বা একটি বার্তা ট্যাগ দ্বারা রেফারেন্সড হয়: error: Server does not allow request for unadvertised object

    স্থানীয় পরীক্ষার স্ক্রিপ্ট । গিটহাবে একই আচরণ:

    git clone --recurse-submodules --shallow-submodules https://github.com/cirosantilli/test-shallow-submodule-top-sha
    # error
    

    আমি মেলিং তালিকায়ও জিজ্ঞাসা করেছি: https://marc.info/?l=git&m=151863590026582&w=2 এবং উত্তরটি ছিল:

    তত্ত্বের ক্ষেত্রে এটি সহজ হওয়া উচিত। :)

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

    তারের প্রোটোকল সঠিক sha1 গুলি জিজ্ঞাসা করার জন্য সমর্থন করে, যাতে এটি আবৃত করা উচিত। (ক্যাভিয়েট: সার্ভার অপারেটর যদি আপলোডপ্যাক সক্ষম করে তবেই এটি কাজ করে allow

    গিট-ফেচটি স্বেচ্ছাসেবী sha1 আনতে সহায়তা করে, সুতরাং কাজের ব্যয় হিসাবে আপনি "গিট সাবমডিউল আপডেট" ব্যবহার করে পুনরাবৃত্ত ক্লোনটির পরে একটি আনতে পারেন যাতে এটি প্রাথমিক ক্লোনটির পরে ফেচ ব্যবহার করবে।

করণীয় পরীক্ষা: allowReachableSHA1InWant


দেখে মনে হচ্ছে সাব-মডুলের জন্য পৃথক হেড কমিট হ্যাশ চেক আউট করার সহজ কোনও উপায় নেই এবং git clone --recursiveকেবলমাত্র সেই নির্দিষ্ট প্রতিশ্রুতি আনার ডাউনস্ট্রিম ব্যবহারকারী রয়েছে ।
সিএমসিডিগ্রাগনকাই

3

আপনার সাবমোডিউলগুলির জন্য ক্যানোনিকাল অবস্থানগুলি কি দূরবর্তী? যদি তা হয় তবে একবারে ক্লোনিং করে আপনি কি ঠিক আছেন? অন্য কথায়, আপনি ঘন ঘন সাবমডিউল (পুনরায়) ক্লোনগুলির নষ্ট ব্যান্ডউইদথকে ভুগছেন বলেই কি অগভীর ক্লোনগুলি চান?

যদি আপনি স্থানীয় ডিস্কস্পেস সংরক্ষণ করার জন্য অগভীর ক্লোনগুলি চান, তবে রায়ান গ্রাহামের উত্তরটি ভাল যাওয়ার মতো মনে হচ্ছে। সংগ্রহস্থলগুলি ম্যানুয়ালি ক্লোন করুন যাতে সেগুলি অগভীর হয়। যদি আপনি মনে করেন এটি কার্যকর হবে তবে git submoduleএটি সমর্থন করার জন্য মানিয়ে নিন। এটি সম্পর্কে জিজ্ঞাসা করে তালিকায় একটি ইমেল প্রেরণ করুন (এটি বাস্তবায়নের জন্য পরামর্শ, ইন্টারফেসের বিষয়ে পরামর্শ ইত্যাদি)। আমার মতে, লোকেরা সম্ভাব্য অবদানকারীদের যথেষ্ট সমর্থনকারী যারা আন্তরিকভাবে গঠনমূলক উপায়ে গিটকে বাড়াতে চায়।

আপনি যদি প্রতিটি সাবমোডিয়ুলের একটি সম্পূর্ণ ক্লোন করে ঠিকঠাক করেন (প্লাস পরে এগুলি আপ টু ডেট রাখার জন্য), আপনি স্থানীয় অবজেক্ট স্টোরগুলি উল্লেখ করার --referenceজন্য git submodule update(এটি গিট ১.6.৪ এবং পরে রয়েছে) বিকল্পটি ব্যবহার করার চেষ্টা করতে পারেন করতে --mirrorক্যানোনিকাল submodule আধারগুলির ক্লোনস, তারপর ব্যবহার --referenceএই স্থানীয় ক্লোনস বিন্দু আপনার submodules মধ্যে)। ব্যবহার সম্পর্কে git clone --reference/ git clone --sharedআগে কেবল পড়তে ভুলবেন না --reference। রেফারেন্সিং মিররগুলির একমাত্র সম্ভাব্য সমস্যাটি হ'ল যদি তারা কখনও অ-দ্রুত-অগ্রিম আপডেটগুলি আনতে শেষ করে (যদিও আপনি কোনও সমস্যা হতে পারে এমন কোনও পরিত্যক্ত প্রতিশ্রুতি রক্ষা করতে আপনি পুনঃব্লাগগুলি সক্ষম করতে এবং তাদের মেয়াদোত্তীর্ণ উইন্ডোগুলি প্রসারিত করতে পারেন)। যতক্ষণ না আপনার কোনও সমস্যা হওয়া উচিত নয়

  • আপনি কোনও স্থানীয় সাব-মডিউল কমিট করবেন না, বা
  • ক্যানোনিকাল সংগ্রহস্থলগুলি প্রকাশিত করতে পারে এমন নন-ফাস্ট-ফরওয়ার্ডগুলির দ্বারা ঝুঁকির মধ্যে থাকা কোনও কমিটগুলি আপনার স্থানীয় সাবমডিউলের কমিটের পূর্বপুরুষ নয়, বা
  • আপনি আপনার স্থানীয় সাবমডিউলকে ক্যানোনিকাল সাবমডিউল রিপোজিটরিগুলিতে প্রকাশিত হতে পারে নাহয় দ্রুত-ফরওয়ার্ডগুলির শীর্ষে পুনর্বাসিত করার বিষয়ে কঠোর পরিশ্রমী।

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

এবং git cloneম্যানপেজটি বলেছে --referenceযে আপনি যদি এই প্রভাবগুলি না বুঝতে পারেন তবে ব্যবহার করবেন না।

# Full clone (mirror), done once.
git clone --mirror $sub1_url $path_to_mirrors/$sub1_name.git
git clone --mirror $sub2_url $path_to_mirrors/$sub2_name.git

# Reference the full clones any time you initialize a submodule
git clone $super_url super
cd super
git submodule update --init --reference $path_to_mirrors/$sub1_name.git $sub1_path_in_super
git submodule update --init --reference $path_to_mirrors/$sub2_name.git $sub2_path_in_super

# To avoid extra packs in each of the superprojects' submodules,
#   update the mirror clones before any pull/merge in super-projects.
for p in $path_to_mirrors/*.git; do GIT_DIR="$p" git fetch; done

cd super
git pull             # merges in new versions of submodules
git submodule update # update sub refs, checkout new versions,
                     #   but no download since they reference the updated mirrors

বিকল্প হিসাবে, পরিবর্তে --reference, আপনি আপনার সাবমোডিয়ুলের git cloneউত্স হিসাবে স্থানীয় আয়না ব্যবহার করে ডিফল্ট হার্ডলিংকিং কার্যকারিতার সাথে মিলিয়ে মিরর ক্লোনগুলি ব্যবহার করতে পারেন । নতুন সুপার-প্রজেক্টের ক্লোনগুলিতে, স্থানীয় আয়নাতে নির্দেশ করতে git submodule initসাব-মডুল URL গুলি সম্পাদনা করুন, করুন edit.git/configgit submodule update। হার্ডলিঙ্কগুলি পেতে আপনাকে যে কোনও বিদ্যমান চেক-আউট সাবমডিউলগুলি পুনরায় সংবিধান করতে হবে। আপনি একবার আয়নায় একবার ডাউনলোড করে ব্যান্ডউইদথ সংরক্ষণ করবেন, তারপরে আপনার চেক-আউট সাবমডিউলগুলিতে স্থানীয়ভাবে এনেছিলেন। কঠোর লিঙ্কিংয়ের ফলে ডিস্কের জায়গা বাঁচবে (যদিও ফ্যাচগুলি চেক-আউট সাবমডিউলসের অবজেক্ট স্টোরগুলির একাধিক উদাহরণ জুড়ে সংগ্রহ এবং নকল হতে পারে; আপনি নিয়মিতভাবে প্রদত্ত ডিস্কের স্থান সঞ্চয় পুনরুদ্ধার করতে আয়নাগুলি থেকে চেক-আউট সাবমডিউলগুলি পুনরায় সংলগ্ন করতে পারবেন) could hardlinking)।


2

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

#!/bin/bash
git submodule init
git submodule | while read hash name junk; do
    spath=$(git config -f .gitmodules --get submodule.$name.path)
    surl=$(git config -f .gitmodules --get submodule.$name.url)
    sbr=$(git ls-remote --tags $surl | sed -r "/${hash:1}/ s|^.*tags/([^^]+).*\$|\1|p;d")
    if [ -z $sbr ]; then
        git clone $surl $spath
    else
        git clone -b $sbr --depth 1 --single-branch $surl $spath
    fi
done
git submodule update 

2

নির্দিষ্ট পুনর্বিবেচনা / চেঞ্জসেটের সাহায্যে গিট সংগ্রহস্থল কীভাবে ক্লোন করবেন তা উল্লেখ ?

আমি একটি সাধারণ স্ক্রিপ্ট লিখেছি যা আপনার সাবমডিউল রেফারেন্স মাস্টার থেকে দূরে থাকলে কোনও সমস্যা নেই

git submodule foreach --recursive 'git rev-parse HEAD | xargs -I {} git fetch origin {} && git reset --hard FETCH_HEAD'

এই বিবৃতিটি সাবমোডিয়ুলের রেফারেন্সযুক্ত সংস্করণ আনবে।

এটি দ্রুততর তবে আপনি সাবমডিউলে আপনার সম্পাদনা প্রতিশ্রুতিবদ্ধ করতে পারবেন না (আপনাকে https://stackoverflow.com/a/17937889/3156509 এর আগে এটি আনসাশো এনে দিতে হবে )

পুরাপুরি:

#!/bin/bash
git submodule init
git submodule foreach --recursive 'git rev-parse HEAD | xargs -I {} git fetch origin {} && git reset --hard FETCH_HEAD'
git submodule update --recursive

1

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

#!/bin/bash
git submodule deinit --all -f
for value in $(git submodule | perl -pe 's/.*(\w{40})\s([^\s]+).*/\1:\2/'); do
  mysha=${value%:*}
  mysub=${value#*:}
  myurl=$(grep -A2 -Pi "path = $mysub" .gitmodules | grep -Pio '(?<=url =).*/[^.]+')
  mydir=$(dirname $mysub)
  wget $myurl/archive/$mysha.zip
  unzip $mysha.zip -d $mydir
  test -d $mysub && rm -rf $mysub
  mv $mydir/*-$mysha $mysub
  rm $mysha.zip
done
git submodule init

git submodule deinit --all -f সাবমডিউল ট্রি সাফ করে যা স্ক্রিপ্টটি পুনরায় ব্যবহারযোগ্য হতে দেয়।

git submodule40 চর sha1 পুনরুদ্ধার করে এরপরে একই সাথে অনুরূপ একটি পথ অনুসরণ করে .gitmodules। আমি Perl ব্যবহার এই তথ্যটি একটি কোলন দ্বারা সীমায়িত কনক্যাটেনেট, তারপর পরিবর্তনশীল রূপান্তর মধ্যে মান আলাদা চাকরী myshaএবং mysub

এগুলি সমালোচনামূলক কীগুলি কারণ আমাদের ডাউনলোড করার জন্য sha1 urlএবং ইনগিটমডিউলগুলি সংযুক্ত করার জন্য পথ প্রয়োজন ।

একটি সাধারণ সাব-মডিউল এন্ট্রি দেওয়া হয়েছে:

[submodule "label"]
    path = localpath
    url = https://github.com/repository.git

myurlpath =তারপরে কীগুলি মান পেতে 2 লাইনের পরে দেখায়। এই পদ্ধতিটি অবিচ্ছিন্নভাবে কাজ না করে এবং পরিশোধন প্রয়োজন। ইউআরএল গ্রেপ .gitশেষের সাথে /এবং কোনও এ পর্যন্ত কোনও কিছুর সাথে মিল রেখে কোনও অবশিষ্ট প্রকারের রেফারেন্সগুলি স্ট্রিপ করে .

mydirহয় mysubমাইনাস একটি চূড়ান্ত /nameতালিকা submodule নাম পর্যন্ত নেতৃস্থানীয় দ্বারা would পারে।

এরপরে wgetডাউনলোডযোগ্য জিপ সংরক্ষণাগার ইউআরএলের ফর্ম্যাট সহ একটি । ভবিষ্যতে এটি পরিবর্তন হতে পারে।

ফাইলটি আনজিপ করুন mydirযা সাবমডিউল পথে নির্দিষ্ট সাব-ডাইরেক্টরি হবে। ফলাফল ফোল্ডারটি url- এর শেষ উপাদান হবে sha1

সাবমোডুল পাথটিতে উল্লিখিত সাব-ডিরেক্টরিটি বিদ্যমান কিনা তা পরীক্ষা করে দেখুন এবং নিষ্কাশিত ফোল্ডারটির পুনরায় নামকরণের অনুমতি দেওয়ার জন্য এটি সরান।

mv আমাদের sha1 সমেত নিষ্ক্রিয় ফোল্ডারের পুনরায় নামকরণ করুন এটির সঠিক সাব-মডুলুল পথে।

ডাউনলোড জিপ ফাইল মুছুন।

সাবমডিউল ইনি

এটি সমাধানের চেয়ে ধারণার আরও ডাব্লুআইপি প্রমাণ। যখন এটি কাজ করে, ফলাফলটি একটি নির্দিষ্ট চেঞ্জসেটে সাব-মডুলের একটি অগভীর ক্লোন।

যদি সংগ্রহস্থলটি একটি পৃথক প্রতিশ্রুতিতে একটি সাবমডিউলটিকে পুনরায় হোম করে তোলে, আপডেট করার জন্য স্ক্রিপ্টটি আবার চালান।

এই জাতীয় স্ক্রিপ্টটি কেবলমাত্র কোনও উত্স প্রকল্পের অ-সহযোগী স্থানীয় বিল্ডিংয়ের জন্য কার্যকর হবে।

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