সাবমডিউলগুলি সহ কীভাবে "গিট ক্লোন" করবেন?


1988

আমি একটি রেপোতে একটি submodule রাখার চেষ্টা করছি। সমস্যাটি হ'ল আমি যখন পিতামাতার রেপো ক্লোন করি তখন সাবমডিউল ফোল্ডারটি পুরোপুরি খালি থাকে।

এটি তৈরি করার কোনও উপায় কি যাতে git clone parent_repoউপ-মডেল ফোল্ডারে ডেটা রাখে?

উদাহরণস্বরূপ, http://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-nativeএকটি বাহ্যিক গিট সাবমডিউলটির দিকে ইঙ্গিত করছে তবে আমি যখন sequelizeপ্রকল্পটি চেকআউট করব তখন সেই ফোল্ডারটি খালি is


4
এই কমান্ডটি হবে git clone --recurse-submodules --remote-submodules(Q3 2019 গিট 2.23): এটি এক কমান্ডের সাবমডিউলগুলি ক্লোন করে আপডেট করবে। দেখুন নীচের আমার সম্পাদিত উত্তর
ভোনসি

উত্তর:


2974

গিটের ২.১৩ সংস্করণ এবং তারপরে, এর --recurse-submodulesপরিবর্তে ব্যবহার করা যেতে পারে --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

সম্পাদকের দ্রষ্টব্য: -j8একটি performanceচ্ছিক পারফরম্যান্স অপটিমাইজেশন যা ২.৮ সংস্করণে উপলভ্য হয়েছিল এবং সমান্তরালে একসাথে 8 টি সাবমডিউল আনছে - দেখুন man git-clone

সংস্করণ ২.১২ অবধি গিট আপের ১.৯ সংস্করণ সহ ( -jশুধুমাত্র সংস্করণ ২.৮++ এ উপলব্ধ):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

গিটের 1.6.5 সংস্করণ এবং তারপরে, আপনি ব্যবহার করতে পারেন:

git clone --recursive git://github.com/foo/bar.git
cd bar

ইতিমধ্যে ক্লোন করা রেপো বা পুরানো গিট সংস্করণের জন্য ব্যবহার করুন:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

122
আপনার গিট সংগ্রহস্থলটিতে এই আচরণটি ডিফল্ট হিসাবে নির্দিষ্ট করার কোনও উপায় নেই, যাতে কম-অবহিত ক্লোনাররা স্বয়ংক্রিয়ভাবে একটি আরম্ভকৃত সাবমডিউলটি পেতে পারে?
এনএইচডালি

11
@ এনএইচডালি দুঃখের বিষয়, না। (এটি আমি জানি না, কমপক্ষে))
ম্যাথিয়াস বাইনেস

6
এবং যৌক্তিকভাবে গিট ক্লোনটি চিন্তা করে - পুনরুক্তি একটি উপকেন্দ্রের কোনও সাবমোডিয়ুলকেও গড়ে তুলবে, তাই না?
জয়য়ারজো


5
@ টসস্টার: এটি এত বুদ্ধিমান? হোল্ডিং রেপো যদি একটি সাবমোডিয়ুলের সংস্করণ না হয় তবে তাmaster কী?
গৌথির

498

সাবমডিউলটি পূরণ হওয়ার আগে আপনাকে দুটি জিনিস করতে হবে:

git submodule init 
git submodule update

8
আমি সে সম্পর্কে ভীত ছিলাম ... আপনি যে ক্ষেত্রে একটি আংশিক প্রকল্পটি পরীক্ষা করে দেখছেন এটির কোনও অর্থ হয় না। আমি বুঝতে পারি যে সাবমডিউল আপডেটগুলি স্বয়ংক্রিয় নয়, তবে বাউন্ড সংস্করণটি স্বয়ংক্রিয়ভাবে চেক আউট কেন হয় না ?? এটি জোর করার কোন উপায় আছে? আমার কাছে 3-স্তরের সাবমডিউলগুলির সাথে একটি প্রকল্প রয়েছে এবং এটি কেবলমাত্র একটি চেকআউট করার জন্য কেবল অদৃশ্য হয়ে যাওয়া অযৌক্তিক বলে মনে হচ্ছে।
চিহ্নিত করুন

10
অনুগ্রহ করে পড়ুন git-submodule(1)মানুষ পৃষ্ঠা ( kernel.org/pub/software/scm/git/docs/git-submodule.html )। আপনি খুঁজে পাবেন এটি কল করা git submodule updateএকটি দুর্দান্ত প্যারামিটার সমর্থন করে --recursive
joschi

94
কেন কেবল তাদের উভয়ই এক আদেশে নয়? git submodule update --init(এছাড়াও আমার উত্তর দেখুন )।
ম্যাথিয়াস বাইনেস

9
এই দুটি কমান্ড দিয়ে প্রশ্নের উত্তর দেওয়া ভাল বলে আমি মনে করি। এটি কীভাবে কার্য সম্পাদন করতে হবে তা আরও ভালভাবে ব্যাখ্যা করে।
schmijos

6
@ ম্যাথিয়াসবাইনেন্স এমন একটি মেশিনে আমি সবেমাত্র লগইন করেছি 1.5.5.6, যা দৃশ্যত সংক্ষিপ্ত নির্দেশকে সমর্থন করে না, তবে দুটি আদেশ হিসাবে এটি সমর্থন করে support
জ্যাক পলসন

220

Git 2.23 (চতুর্থাংশ 3 2019): আপনি ক্লোন করতে চান তাহলে এবং তাদের সর্বশেষ সংস্করণে submodules আপডেট করুন:

git clone --recurse-submodules --remote-submodules

আপনি যদি কেবল তাদের রেকর্ড করা SHA1 এ ক্লোন করতে চান:

git clone --recurse-submodules

নিচে দেখ.


আসল উত্তর 2010

মন্তব্যে জোসচি যেমন উল্লেখ করেছেন, git submoduleএখন --recursiveবিকল্পটি (Git1.6.5 এবং আরও অনেক কিছু) সমর্থন করে ।

যদি --recursiveনির্দিষ্ট করা থাকে তবে এই কমান্ডটি নিবন্ধিত সাবমডিউডগুলিতে পুনরাবৃত্তি করবে এবং এর মধ্যে কোনও নেস্টেড সাবমডিউল আপডেট করবে।

আর ডি অংশের জন্য পুনরাবৃত্তভাবে গিট সাবমডিউলগুলির সাথে কাজ করা দেখুন ।
আরও জন্য git submoduleব্যাখ্যা দেখুন।

গিটের 1.6.5 সংস্করণ এবং তারপরে, আপনি –-recursiveবিকল্পটি দিয়ে সুপার-প্রকল্পের ক্লোনিং করে স্বয়ংক্রিয়ভাবে এটি করতে পারেন :

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

গিট ২.৮ সহ ২০১ 2016 আপডেট করুন: " গিট সাবমডিউলগুলি ব্যবহার করে কীভাবে গতি বাড়ানোর / সমান্তরাল ডাউনলোডগুলি করবেন git clone --recursive? "

সমান্তরালভাবে আপনি একাধিক থ্রেড ব্যবহার করে সাবমোডুল আনতে শুরু করতে পারেন।
তৎক্ষণাৎ:

git fetch --recurse-submodules -j2

আরও ভাল, গিট ২.২৩ (Q3 2019) এর সাহায্যে আপনি সাবমোডুলটিকে ক্লোন করতে এবং একটি কমান্ডে তাদের ট্র্যাকিং শাখায় চেকআউট করতে পারেন!

বেন অ্যাভিসন ( ) দ্বারা 4c69101 (19 মে 2019) প্রতিশ্রুতিবদ্ধ দেখুন । (দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট 9476094 , 17 জুন 2019)bavison
gitster

clone: --remote-submodulesপতাকা যুক্ত করুন

ব্যবহার git clone --recurse-submodulesকরার পূর্বে কোনও ব্যবহারের ক্ষেত্রে --remoteইম্পিলেটেড git submodule updateকমান্ডের স্যুইচটি পাস করার কোনও উপায় ছিল না যেখানে আপনি চান যে সাবমোডিয়ালগুলি সুপার প্রোজেক্টে রেকর্ড করা SHA-1 এর পরিবর্তে তাদের রিমোট-ট্র্যাকিং শাখায় চেক আউট করা উচিত।

এই প্যাচ এই পরিস্থিতি সংশোধন করে।
এটা আসলে পাসের --no-fetchজন্য git submodule updateভাল ভিত্তিতে তারা submodule কেবল মাত্র ক্লোন করা হয়ে হিসাবে, আবার দূরবর্তী শুধুমাত্র থেকে আনার সময় তাই মন্দীভূত জিনিস কাজ করে।

এর মানে:

--[no-]remote-submodules:

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


3
সুতরাং গিটকে সাবমডিউলগুলির জন্য যথাযথ সমর্থন যোগ করতে 14 বছর লেগেছিল, হু। আপডেটের জন্য ধন্যবাদ! আমার যদি ইতিমধ্যে সাবমোডিউলগুলি ছাড়াই এবং কোনও রেকর্ডড এসএএএ 1 ছাড়াই মূল রেপোর ক্লোন থাকে এবং আমি প্রতিটি উপ-মডেলের সর্বশেষতম সংস্করণটি টানতে চাই। এটা কি doable?
ভায়োলেট জিরাফ

1
@ ভায়োলেটজিরাফ যদি সেই ক্লোন করা সংগ্রহস্থলের সাবমোডিয়ুল থাকে তবে এটিতে "রেকর্ড করা SHA1" রয়েছে। এবং একটি git submodule update --init --recursive --remoteতাদের নিজ নিজ শাখার সর্বশেষ প্রতিশ্রুতি আপডেট করতে হবে। (উদা: stackoverflow.com/a/56981834/6309 )
VonC

1
আমি একটি উদাহরণ দিয়ে স্পষ্ট করে বলি: আমার গিথুবতে একটি টেম্পলেট প্রকল্প রয়েছে যা সাবমডিউলগুলি ব্যবহার করে এবং আমি এমনকি এই টেম্পলেট রেপোতে সাবমডিউলের নির্দিষ্ট সংশোধনগুলিও করেছিলাম। কিন্তু যখন আমি এই রেপো থেকে কোনও নতুন প্রকল্প তৈরি করি, আপনি তালিকাবদ্ধ কমান্ডগুলির মধ্যে কোনওটিই (না হয় clone --recurse-submodules --remote-submodulesনা submodule update --init --recursive --remote) আমাকে প্রকৃতপক্ষে সাবরেপোস আনতে দেয়। আমি যা পাই তা হ'ল একটি। গিটমডিউল ফাইল এবং আমি নিজে থেকে একের পর এক ক্লোনিং করা ছাড়া সাবরেপসগুলি আরম্ভ করার কোনও উপায় খুঁজে পেলাম না। আমি এটির সাথে কমপক্ষে একটি স্ক্রিপ্ট রাখতে চাই submodule foreach...
ভায়োলেট জিরাফ

আপনি যদি কোনও সমাধান জানেন তবে আমি একটি পৃথক প্রশ্ন জিজ্ঞাসা করব যা আপনি উত্তর দিতে পারেন। এখানে টেস্ট রেপো যে আমি হাত ছাড়া আর কোনও উপায় খুঁজে পাচ্ছি না: github.com/VioletGiraffe/TEST
ভায়োলেট জিরাফ

@VioletGiraffe এটা এ কারণে যে জুড়েছে এবং .gitmodules কিন্তু gitlink (সংঘটিত হয়েছে stackoverflow.com/a/16581096/6309 সূচক বিশেষ এন্ট্রি: stackoverflow.com/a/19354410/6309 ) এখানে একটি সংগ্রহস্থলের যা নেই সঠিক গিটলিংক নিবন্ধিত করুন: github.com/tiagomazzutti/antlr4dart
VonC

108

[দ্রুত উত্তর]

আপনি এই কমান্ডটি সমস্ত সাব-মডিউলগুলির সাথে আপনার রেপো ক্লোন করতে ব্যবহার করতে পারেন:

git clone --recursive YOUR-GIT-REPO-URL

বা আপনি যদি ইতিমধ্যে প্রকল্পটি ক্লোন করে রেখেছেন তবে আপনি এটি ব্যবহার করতে পারেন:

git submodule init
git submodule update

33

যদি আপনার সাবমডিউলটি কোনও শাখায় যুক্ত করা হয়েছিল তবে এটি আপনার ক্লোন কমান্ডে অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন ...

git clone -b <branch_name> --recursive <remote> <directory>

এটি আমি যা খুঁজছিলাম তার মতোই ... তবে সাবমডিউলগুলি তাদের শাখাটিকে 'বিযুক্ত' হিসাবে তালিকাভুক্ত করে। :(
এসিফঙ্ক

28

এটা চেষ্টা কর:

git clone --recurse-submodules

আপনি ইতিমধ্যে প্যারেন্ট প্রোজেক্টে সাবমডিউলগুলি যুক্ত করে ধরে নিয়েছেন এটি স্বয়ংক্রিয়ভাবে সাবমডিউল ডেটাতে টান দেয়।


37
মনে রাখবেন যে, --recurse-submodulesএবং --recursiveহয় সমতুল্য alias লেখা
জোয়েল পুরারা

এই ক্ষেত্রে @ সুপারউবারডুপার আপনি এই উত্তরে বর্ণিত git submodule update --init --recursiveহিসাবে করতে পারেন
এনরিকো


21

বিলম্বিত উত্তর

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

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


ঠিক এটাই আমি কাজ করছি। সুতরাং, আপনি কি বলছেন যে সাবমোডিয়ালগুলি রয়েছে এমন বিটবাকেট সংগ্রহস্থল গড়ে তোলার প্রয়োজন সেই ব্যক্তিকে অবশ্যই সংগ্রহশালার স্রষ্টার শংসাপত্র ব্যবহার করতে হবে? Blech।
jsleuth

@ জেসলিথ মনে হয় - এটি বড় সময় চুষে ... এবং আমি এটি জানি।
কায়সার

এটি বাগের মতো শোনাচ্ছে। আপনি কি এটি বিটবাকেটে রিপোর্ট করেছেন?
ম্যাথিয়াস বাইনেস

@ ম্যাথিয়াসবাইনেন্স আপনি কি এই বিষয়টি নিয়ে হোঁচট খেয়েছেন? এটি দেড় বছর পরে এবং আমি এখনও জানি না এটি এখনও এরকম কিনা।
কায়সার 21

4
এটি ওপিএস প্রশ্নের বর্ণনামূলকভাবে উত্তর দেয় না, তবে বিটবকেটে কোনও সম্পর্কযুক্ত বাগের বিবরণ দেয়; যা ঘটনাক্রমে, কেবল "এসএসএইচ কী প্রমাণীকরণ ব্যবহার করতে" ছোট করা যেতে পারে।
ট্রেফিনন

18

গিট সংগ্রহস্থলের সাবমডিউলগুলি অন্তর্ভুক্ত করার জন্য এটি ব্যবহার করে দেখুন।

git clone -b <branch_name> --recursive <remote> <directory>

অথবা

git clone --recurse-submodules

18

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

git clone --recursive git@repo.org:your_repo.git

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

git submodule foreach "git checkout master"

17

[দ্রুত উত্তর]

অভিভাবক রেপো ক্লোন করার পরে (যার মধ্যে কিছু সাবমডিউল রেপো রয়েছে) নিম্নলিখিত হিসাবে করুন:

git submodule update --init --recursive

11

সমান্তরাল আনতে সাবমডিউলগুলি একবারে একাধিক সংগ্রহস্থল আনতে সক্ষম করে একটি সংগ্রহস্থল এবং এর সাথে সম্পর্কিত সমস্ত সাবমডিউল আনার জন্য প্রয়োজনীয় সময় হ্রাস করা হয়। এটি নতুন --jobs বিকল্পটি ব্যবহার করে সম্পন্ন করা যেতে পারে, যেমন:

git fetch --recurse-submodules --jobs=4

গিট টিমের মতে, এটি প্রচুর সাবমডিউলযুক্ত রিপোজিটরিগুলিকে আপডেট করার ক্ষেত্রে যথেষ্ট পরিমাণে গতি আনতে পারে। নতুন --jobs বিকল্প ব্যতীত --recurse-submodule ব্যবহার করার সময়, গিট একে একে সাব-মডিউলগুলি আনবে।

সূত্র: http://www.infoq.com/news/2016/03/git28- খুশি


8

গিটহাবের সংগ্রহশালার ক্ষেত্রেও আমার একই সমস্যা ছিল। আমার অ্যাকাউন্টে এসএসএইচ কী অনুপস্থিত ছিল। প্রক্রিয়াটি হ'ল

  1. এসএসএইচ কী তৈরি করুন
  2. আপনার গিটহাব অ্যাকাউন্টে একটি নতুন এসএসএইচ কী যুক্ত করা হচ্ছে

তারপরে, আপনি সাবমোডিয়ুলগুলি ( git clone --recursive YOUR-GIT-REPO-URL) দ্বারা ভান্ডারটি ক্লোন করতে পারেন

অথবা

ইতিমধ্যে ক্লোন করা সংগ্রহস্থলগুলিতে সাবমোডিয়ুলগুলি চালনা git submodule initএবং git submodule updateআনার জন্য।


হ্যাঁ, এটি Permission denied (publickey). fatal: Could not read from remote repository.ত্রুটি
এন্ডার

5

এটা চেষ্টা কর.

git clone -b <branch_name> --recursive <remote> <directory>

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


5

যদি এটি একটি নতুন প্রকল্প হয় তবে আপনি কেবল এটির মতো করতে পারেন:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

এটি ইতিমধ্যে ইনস্টল করা থাকলে:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.