সমস্ত গিট সাবমডিউলগুলিতে সর্বশেষতম টানার সহজ উপায়


1845

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

এই কাজটি করার জন্য গিটের কি বিল্ট ইন কমান্ড রয়েছে? যদি তা না হয় তবে উইন্ডোজ ব্যাচের ফাইল বা অনুরূপ যে এটি করতে পারে তা সম্পর্কে কীভাবে?


গিট-ডিপ এটিকে সাহায্য করবে।
ম্যাথিউ কুরিয়ান

9
@ ব্র্যাড আপনি কি সাবমডিউলের কপিগুলি মাস্টার প্রজেক্টে নামকরণ করা কমিট রেভিজে আপডেট করতে চান; অথবা আপনি কি প্রতিটি সাবমডিউল থেকে সর্বশেষতম হেড কমিট টানতে চান? এখানে বেশিরভাগ উত্তর পূর্বকে সম্বোধন করে; অনেক মানুষ পরেরটি চায়।
ক্রিসিনমটাউন

উত্তর:


2461

যদি এটি প্রথমবার আপনি কোনও রেপো চেক-আউট করেন তবে আপনাকে --initপ্রথমে ব্যবহার করতে হবে :

git submodule update --init --recursive

জন্য Git 1.8.2 অথবা উপরে বিকল্পটি --remoteদূরবর্তী শাখা সর্বশেষ টিপস সমর্থন আপডেট যোগ করা হয়েছিল:

git submodule update --recursive --remote

এতে ফাইল .gitmodulesবা .git/configফাইলগুলিতে নির্দিষ্ট হওয়া কোনও "অ-ডিফল্ট" শাখাকে সম্মান করার অতিরিক্ত সুবিধা রয়েছে (যদি আপনার কোনওটি হয় তবে ডিফল্টটি উত্স / মাস্টার হয়, সেক্ষেত্রে এখানে অন্যান্য উত্তরগুলির মধ্যে কিছু কাজ করবে)।

জন্য Git 1.7.3 অথবা উপরে আপনি ব্যবহার করতে পারেন (কিন্তু কি আপডেট এখনও প্রযোজ্য প্রায় gotchas নীচে):

git submodule update --recursive

বা:

git pull --recurse-submodules

যদি আপনি আপনার সাবমোডিয়ালগুলিকে বর্তমানের কমিটের পরিবর্তে সর্বশেষ কমিটে টানতে চান তবে রেপো পয়েন্টগুলিতে প্রতিশ্রুতিবদ্ধ।

দেখুন Git-submodule (1) বিস্তারিত জানার জন্য


299
সম্ভবত আপনার git submodule update --recursiveআজকাল ব্যবহার করা উচিত ।
জেনস কোহল

38
পারফরম্যান্স উন্নতি:git submodule foreach "(git checkout master; git pull)&"
বোগদান গুসিভ

18
আপডেট প্রতিটি সাবমোডিয়াকে নির্দিষ্ট সংশোধন করে আপডেট করবে, that সংগ্রহস্থলের জন্য সর্বশেষে আপডেট করবে না।
পিটার ডিউইউস

21
কেবল যোগ করার জন্য, origin masterআপনার কতিপয় সাবমডিউলগুলি সেই নির্দিষ্ট সাবমোডিয়ালের কোনও আলাদা শাখা বা অবস্থানের নাম ট্র্যাক করে থাকলে এই কমান্ডটির শেষে অন্ধভাবে আঁকড়ে থাকলে অপ্রত্যাশিত ফলাফল হতে পারে। কারও কাছে স্পষ্ট, তবে সবার কাছে সম্ভবত তা নয়।
নাথন হর্নবি

31
সবার জন্য কেবল স্পষ্ট করার জন্য। git submodule update --recursiveপ্রতিটি সাবমোডিয়ুলের জন্য প্যারেন্ট রিপোজিটরি কোন সংশোধনটি সংরক্ষণ করেছে তা দেখার জন্য এবং তারপরে প্রতিটি সাবমোডিয়ালে সেই সংশোধনটি পরীক্ষা করে দেখুন। এটা আছে না প্রতিটি submodule জন্য সর্বশেষ করে টান। git submodule foreach git pull origin masterবা git pull origin master --recurse-submodulesআপনি যদি প্রতিটি সাবমোডুলকে তাদের উত্স সংগ্রহস্থল থেকে সর্বশেষে আপডেট করতে চান তবে আপনি কী চান। তবেই আপনি সাবমোডিয়ুলের জন্য আপডেট পুনর্বিবেচনা হ্যাশগুলির সাথে প্যারেন্ট রেপোতে মুলতুবি পরিবর্তনগুলি পাবেন। এগুলিতে যাচাই করুন এবং আপনি ভাল আছেন।
শেভ

636
git pull --recurse-submodules --jobs=10

একটি বৈশিষ্ট্য গিট প্রথম শিখেছিল 1.8.5।

ত্রুটি স্থির না হওয়া পর্যন্ত প্রথমবারের জন্য আপনাকে চালানো দরকার

গিট সাবমডিউল আপডেট --init --recursive


29
আপভোটেড, আমি এটি ব্যবহার করি: ওরফে আপডেট_সুবমডিউলস = 'গিট টান - রিসার্চ-সাবমডিউলস && গিট সাবমডিউল আপডেট'
স্টিফেন সি

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

8
এটি শীর্ষ রেপো নির্দিষ্ট করে থাকা সংস্করণটিতে টানবে; এটি মাথা টান না। উদাহরণস্বরূপ, যদি টপরেপো সুব্রপোর জন্য হেডের পিছনে একটি সংস্করণ 2 নির্দিষ্ট করে, তবে এটি 2 টি পিছনের সংস্করণটির সাথে সাবরেপো টানবে। অন্যান্য উত্তরগুলি এখানে সাবআরপোতে হেড টান।
ক্রিস মোসচিনি

11
লক্ষ্য করুন তন্ন তন্ন git pull --recurse-submodulesনা git submodule update --recursiveকরে না সদ্য submodules যোগ আরম্ভ। এগুলি আরম্ভ করার জন্য আপনার রান দরকার git submodule update --recursive --initম্যানুয়াল থেকে উদ্ধৃতি : যদি সাবমডিউলটি এখনও শুরু না করা হয় এবং আপনি কেবলমাত্র .gitmodules এ সঞ্চিত হিসাবে সেটিংটি ব্যবহার করতে চান, আপনি স্বয়ংক্রিয়ভাবে --init বিকল্পের সাহায্যে সাবমোডিয়ালটি আরম্ভ করতে পারেন।
patryk.beza

1
সম্ভবত এমন একটি ইঙ্গিত যুক্ত করুন git submodule update --recursive --remoteযা সঞ্চিত SHA-1 এর পরিবর্তে দূরবর্তী সর্বশেষ সংশোধনীতে সাবমোডিয়ুলগুলি আপডেট করে।
হ্যানো এস

386

Init নিম্নলিখিত কমান্ডটি চালাচ্ছে:

git submodule update --init --recursive

গিট রেপো ডিরেক্টরি থেকে আমার জন্য সবচেয়ে ভাল কাজ করে।

এটি সাবমডিউলগুলি সহ সর্বশেষ সর্বশেষে টানবে।

ব্যাখ্যা

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

এর পরে আপনি কেবল চালাতে পারবেন:

git submodule update --recursive

গিট রেপো ডিরেক্টরি থেকে আমার জন্য সবচেয়ে ভাল কাজ করে।

এটি সাবমডিউলগুলি সহ সর্বশেষ সর্বশেষে টানবে।


10
হ্যাঁ - '09-এ সর্বাধিক ভোট দেওয়া উত্তরটি এটি করার সর্বোত্তম উপায় ছিল তবে এখন এটি অবশ্যই সহজ এবং আরও স্বজ্ঞাত।
মাইকেল স্কট কুথবার্ট

2
@ মিশেলস্কটকুবার্ট ধন্যবাদ, আমি নিশ্চিত যে আরও 3 বছরে এই
আদেশটিও

5
তবুও, এটি সাবমডিউল থেকে সর্বশেষ সংশোধনটি চেকআউট করে না, কেবলমাত্র পিতা-মাতাকে অনুসরণ করছে এমন সর্বশেষ সংশোধন।
নাথান ওসমান

4
@ নাথানঅসমান যা আপনি চান ... আপনি পিতামাতার পুনর্বিবেচনা ট্র্যাকিং অনুসরণ না করে ভাঙা কোডটি শেষ করবেন। আপনি যদি পিতামাতার রক্ষণাবেক্ষণকারী হন তবে আপনি সেগুলি নিজেরাই আপডেট করতে এবং প্রতিশ্রুতিবদ্ধ করতে পারেন।
abc123

2
হ্যাঁ, তবে আমার বোধগম্যতা থেকে ওপি এটি চেয়েছিল না।
নাথান ওসমান

305

দ্রষ্টব্য: এটি ২০০৯ সালের এবং এটি তখন ভাল হতে পারে তবে এখন আরও ভাল বিকল্প রয়েছে।

আমরা এটি ব্যবহার করি। এটি বলা হয় git-pup:

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

কেবল এটি একটি উপযুক্ত বিন ডিরেক্টরিতে (/ usr / স্থানীয় / বিন) রাখুন। উইন্ডোতে থাকলে, সিনট্যাক্সটি এটির কাজটি করার জন্য আপনার প্রয়োজন হতে পারে :)

হালনাগাদ:

সাবমোডিয়ুলের সমস্ত হেডকে টেনে আনার বিষয়ে মূল লেখকের মন্তব্যের জবাবে - এটি একটি ভাল প্রশ্ন।

আমি পুরোপুরি নিশ্চিত যে gitঅভ্যন্তরীণভাবে এর জন্য কোনও আদেশ নেই। এটি করার জন্য, আপনাকে শনাক্ত করতে হবে যে প্রকৃতপক্ষে কোনও সাবমডিউলের জন্য কী। এটি এতটা সহজ হতে পারে যেমন বলা masterসর্বাধিক আপ ডেট শাখা ইত্যাদি,

এটি অনুসরণ করে, একটি সাধারণ স্ক্রিপ্ট তৈরি করুন যা নিম্নলিখিতগুলি করে:

  1. git submodule status"পরিবর্তিত" সংগ্রহস্থলগুলির জন্য পরীক্ষা করুন । আউটপুট লাইনের প্রথম অক্ষর এটি সূচিত করে। যদি একটি সাব-রেপো সংশোধন করা হয়, আপনি এগিয়ে যেতে চাইবেন না।
  2. তালিকাভুক্ত প্রতিটি রেপোর জন্য সিডি এটির ডিরেক্টরিতে চালান এবং চালান git checkout master && git pull। ত্রুটিগুলি পরীক্ষা করুন।
  3. শেষে, আমি আপনাকে সাবমডিউলের বর্তমান অবস্থা নির্দেশ করতে ব্যবহারকারীর কাছে একটি ডিসপ্লে মুদ্রণ করার পরামর্শ দিচ্ছি - সম্ভবত তাদের সমস্ত সংযুক্ত করতে এবং প্রতিশ্রুতিবদ্ধ হতে অনুরোধ করবেন?

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

এটি, এক অর্থে, আপনি বর্ণিত স্ক্রিপ্টটি দিয়ে কী করছেন, তবে আরও স্বয়ংক্রিয়ভাবে। যত্ন প্রয়োজন!

আপডেট 2:

আপনি যদি উইন্ডোজ প্ল্যাটফর্মে থাকেন তবে স্ক্রিপ্টটি বাস্তবায়নের জন্য পাইথন ব্যবহারের দিকে নজর দিতে পারেন কারণ এটি এই ক্ষেত্রে খুব সক্ষম। আপনি যদি ইউনিক্স / লিনাক্সে থাকেন তবে আমি কেবল একটি বাশ স্ক্রিপ্টের পরামর্শ দিই।

কোন ব্যাখ্যা দরকার? শুধু একটি মন্তব্য পোস্ট করুন।


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

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

আমি কেবল পেয়ে যাচ্ছি "বর্তমান শাখার জন্য কোনও ট্র্যাকিংয়ের তথ্য নেই Please আপনি কোন শাখায় একত্রীকরণ করতে চান দয়া করে তা নির্দিষ্ট করুন" " আমি যা চেষ্টা করি তা নয়: /
নাথান হর্নবি

9
কেন এটির জন্য একটি উপনাম তৈরি করবেন না? git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'এবং তারপরে git pupএটি কোনও স্ক্রিপ্টিং ছাড়াই ব্যবহার করুন ।
fracz

ধন্যবাদ, কোনও কারণে আমার কাছে গিট ১.৯.১ থাকা সত্ত্বেও আমাকে git submodule initপ্রথম টান দেওয়ার পরে পারফর্ম করতে হয়েছিল যাতে সাবমোডিয়ুলগুলি অন্তর্ভুক্ত ছিল, যাতে সবকিছু সঠিকভাবে কাজ শুরু করে।
বেন উসমান

164

হেনরিক সঠিক পথে আছে। 'Foreach' কমান্ড যেকোনও স্বেচ্ছাসেবী শেল স্ক্রিপ্ট কার্যকর করতে পারে। খুব সাম্প্রতিকতম টানতে দুটি বিকল্প হতে পারে,

git submodule foreach git pull origin master

এবং,

git submodule foreach /path/to/some/cool/script.sh

যে সব মাধ্যমে পুনরুক্তি হবে সক্রিয়া submodules এবং প্রদত্ত কমান্ড চালানো।


144

নিম্নলিখিতগুলি উইন্ডোজে আমার জন্য কাজ করেছে।

git submodule init
git submodule update

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

52
তবে এই পৃষ্ঠায় এটিই একমাত্র জিনিস যা আমি প্রথমবারের মতো একটি রেপো পরীক্ষা করে
সাবমোডিয়ালগুলি টানতে পেলাম

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

33

সম্পাদন করা :

মন্তব্যে ( ফিলফ্রেও দ্বারা ) চিহ্নিত করা হয়েছিল যে সর্বশেষতম সংস্করণটি প্রয়োজনীয়। যদি কোনও নেস্টেড সাবমডিউল থাকে যা তাদের সর্বশেষতম সংস্করণে থাকা দরকার:

git submodule foreach --recursive git pull

----- নীচে পুরানো মন্তব্য -----

এটি কি এটি করার সরকারী উপায় নয়?

git submodule update --init

আমি এটি প্রতিবার ব্যবহার করি। এখন পর্যন্ত কোনও সমস্যা নেই।

সম্পাদনা:

আমি সবেমাত্র পেয়েছি যে আপনি ব্যবহার করতে পারেন:

git submodule foreach --recursive git submodule update --init 

যা পুনরাবৃত্তভাবে সমস্ত সাবমোডিয়ালগুলি, অর্থাৎ নির্ভরতা টানবে।


5
আপনার উত্তরটি ওপি-র প্রশ্নের উত্তর দেয় না, তবে আপনি যা প্রস্তাব করেছেন তা করতে আপনি কেবল বলতে পারেনgit submodule update --init --recursive
ফিলিফ্রেও

2
আমি দেখছি, সর্বশেষ সংস্করণ প্রয়োজন। আচ্ছা নেস্টেড সাবমডিউলগুলি থাকলে এটি উপকারী হতে পারে: git submodule foreach --recursive git pull
অ্যান্টিটক্সিক

1
আমি এগুলির আসলে কোনও কিছুই ডাউনলোড করতে পারি না - "গিট সাবমডিউল আপডেট --init --recursive" তবে আমার পক্ষে কাজ করেছে।
BrainSlugs83

33

যেহেতু এটি ঘটতে পারে যে আপনার সাবমোডিউলগুলির ডিফল্ট শাখাটি নয় master , আমি সম্পূর্ণ গিট সাবমডিউলগুলি আপগ্রেডগুলি স্বয়ংক্রিয়ভাবে এটি করব:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

অনেক প্রশ্নের বহু উত্তরের মধ্যে, এইটি আমার পক্ষে কাজ করেছে (2019, নির্দিষ্ট হ্যাশ
আইডিসহ গিথুব

30

প্রথমবার

ক্লোন এবং ইনিশ সাবমডিউল

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

বিশ্রাম

উন্নয়নের সময় কেবল সাবমডিউলটি টানুন এবং আপডেট করুন

git pull --recurse-submodules  && git submodule update --recursive

উত্স সম্পর্কিত সর্বশেষ প্রতিশ্রুতিতে গিট সাবমোডুল আপডেট করুন

git submodule foreach git pull origin master

পছন্দের উপায়টি নীচে থাকা উচিত

git submodule update --remote --merge

দ্রষ্টব্য: শেষ দুটি আদেশের একই আচরণ রয়েছে have


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

এই আনসারটি আসলে এখানে একটি প্রশ্ন জিজ্ঞাসা করার জন্য খুব ভাল উত্তর: আমাকে ".. - রেকর্ডিং-সাবমডিউলস .." এবং তারপরে অতিরিক্ত "... আপডেট ..." এবং এমনকি ".. .ফ্রোচ ... "সর্বশেষ প্রতিশ্রুতি পেতে? এই সব জিআইটি দেখতে মোটেও ভালো লাগে না! "আপডেট" কী করছে এবং আমাকে কেন প্রতিটি মডিউলটিতে টানতে ম্যানুয়ালি যেতে হবে? "... --recurse-submodules .." কি করছে না? কোন ইঙ্গিত?
পিটার ব্রানফোরন

20

আমি জানি না যে এটির গিটারটির কোন সংস্করণ কাজ করছে তবে আপনি এটি অনুসন্ধান করছেন:

git submodule update --recursive

আমি এটির সাথে git pullমূল সংগ্রহস্থল আপডেট করতেও ব্যবহার করি:

git pull && git submodule update --recursive

10

উপরের উত্তরগুলি ভাল, তবে আমরা এটিকে আরও সহজ করতে গিট-হুক ব্যবহার করছিলাম তবে দেখা যাচ্ছে যে গিট ২.১ in-এ আপনি সেট করতে পারেনgit config submodule.recurse যখন আপনার গিট সংগ্রহস্থলের দিকে টানছেন তখন আপনি সাবমোডিয়ুলগুলিকে আপডেট করতে সক্ষম করতে সত্য হিসাবে ।

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

ব্যবহার করে করা যেতে পারে:

git config submodule.recurse true

এই বিকল্পটি পছন্দ করুন, দুর্ভাগ্যক্রমে এখনও git submodule initআপনার আগে ব্যবহার করা দরকার যদিও আপনার সাবমডিউলটি এখনও আরম্ভ করা হয়নি।
পেলিট

5

উইন্ডোজ ২.6.৩ এর জন্য গিট :

git submodule update --rebase --remote


এটাই আমার পক্ষে কাজ করেছে। সাবমোডিয়াল পয়েন্টারটি এমন কোনও সংস্করণে ইঙ্গিত করছিল যা আমি আর রিমোটে ছিল না
পাভেল পি

4

রেপোতে শীর্ষ স্তর থেকে:

git submodule foreach git checkout develop
git submodule foreach git pull

এটি সমস্ত শাখাকে বিকাশ করতে এবং সর্বশেষে টেনে আনতে হবে


2
2.7 গিট সহ আমার পক্ষে কাজ করে না।
ব্রুনো হাইবল

আপনার কাছে কি এরিভিং স্লান ফাইলের মতো কিছু রয়েছে যা গাছের সমস্ত প্রকল্পের রেফারেন্স যুক্ত করে? এছাড়াও আপনি কি ত্রুটি দেখতে পাচ্ছেন? আপনি কি আপনার গিটিগনোর ফাইলটি পরীক্ষা করতে পারেন
শ্রায়ান গুহঠাকুরতা

1
git submodule foreach git pull origin masterআমি যে শাখাটি আনতে চেয়েছিলাম তা যুক্ত করতে হয়েছিল। যে ছাড়া অন্য, নিখুঁতভাবে কাজ।
টরেক্সড

3

আমি অভিযোজিত দ্বারা এই করেনি gahooa এর উপরে উত্তর :

এটি গিটের সাথে একীভূত করুন [alias]...

যদি আপনার প্যারেন্ট প্রকল্পে এর কিছু থাকে তবে .gitmodules:

[submodule "opt/submodules/solarized"]
    path = opt/submodules/solarized
    url = git@github.com:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
    path = opt/submodules/intellij-colors-solarized
    url = git@github.com:jkaving/intellij-colors-solarized.git

আপনার .gitconfig এর ভিতরে এর মতো কিছু যুক্ত করুন

[alias]
    updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "

তারপরে আপনার সাবমোডিয়ুলগুলি আপডেট করতে, চালান:

git updatesubs

আমি একজন আছে উদাহরণস্বরূপ আমার মধ্যে এটি পরিবেশ সেটআপ রেপো


3

আপনার এখন যা করতে হবে তা হ'ল একটি সহজ git checkout

এই গ্লোবাল কনফিগারেশনের মাধ্যমে এটি সক্ষম করার বিষয়টি নিশ্চিত করুন: git config --global submodule.recurse true


2

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

ROOT=$(git rev-parse --show-toplevel 2> /dev/null)
find "$ROOT" -name .git -type d -execdir git pull -v ';'

আপনি আপনার সেরা Git সংগ্রহস্থলের মধ্যে চলমান থাকে, তাহলে আপনি প্রতিস্থাপন করতে পারেন "$ROOT"মধ্যে .


1

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


1

মন্তব্য: খুব সহজ উপায় নয়, তবে কার্যক্ষম এবং এটির নিজস্ব অনন্য বৈশিষ্ট্য রয়েছে।

যদি কেউ কেবলমাত্র HEADএকটি সংগ্রহস্থল এবং HEADতার সমস্ত সাবমোডিয়ুলের (যেমন "" ট্রাঙ্ক "চেকআউট করার জন্য) কেবলমাত্র সংশোধন করতে চান , তবে নিম্নলিখিত লুয়া স্ক্রিপ্টটি ব্যবহার করতে পারেন । কখনও কখনও সরল কমান্ড git submodule update --init --recursive --remote --no-fetch --depth=1একটি অপরিবর্তনযোগ্য gitত্রুটি হতে পারে। .git/modulesএক্ষেত্রে ডিরেক্টরিটির সাব-ডাইরেক্টরি পরিষ্কার করতে হবে এবং git clone --separate-git-dirকমান্ড ব্যবহার করে ম্যানুয়ালি সাবমডিউল ক্লোন করতে হবে । একমাত্র জটিলতা হ'ল ইউআরএল , এর পথ খুঁজে বের করা.git উপপরিক্রমের ডিরেক্টরিগুলির ডিরেক্টরি এবং সুপারপ্রজেক্ট ট্রিতে সাবমোডুলের পথ find

মন্তব্য: স্ক্রিপ্টটি কেবল https://github.com/boostorg/boost.gitসংগ্রহস্থলের বিরুদ্ধে পরীক্ষা করা হয় । এর অদ্ভুততা: সমস্ত সাবমোডিউল একই হোস্টে হোস্ট করা হয় এবং .gitmodulesএতে কেবলমাত্র সম্পর্কিত ইউআরএল থাকে ।

-- mkdir boost ; cd boost ; lua ../git-submodules-clone-HEAD.lua https://github.com/boostorg/boost.git .
local module_url = arg[1] or 'https://github.com/boostorg/boost.git'
local module = arg[2] or module_url:match('.+/([_%d%a]+)%.git')
local branch = arg[3] or 'master'
function execute(command)
    print('# ' .. command)
    return os.execute(command)
end
-- execute('rm -rf ' .. module)
if not execute('git clone --single-branch --branch master --depth=1 ' .. module_url .. ' ' .. module) then
    io.stderr:write('can\'t clone repository from ' .. module_url .. ' to ' .. module .. '\n')
    return 1
end
-- cd $module ; git submodule update --init --recursive --remote --no-fetch --depth=1
execute('mkdir -p ' .. module .. '/.git/modules')
assert(io.input(module .. '/.gitmodules'))
local lines = {}
for line in io.lines() do
    table.insert(lines, line)
end
local submodule
local path
local submodule_url
for _, line in ipairs(lines) do
    local submodule_ = line:match('^%[submodule %"([_%d%a]-)%"%]$')
    if submodule_ then
        submodule = submodule_
        path = nil
        submodule_url = nil
    else
        local path_ = line:match('^%s*path = (.+)$')
        if path_ then
            path = path_
        else
            submodule_url = line:match('^%s*url = (.+)$')
        end
        if submodule and path and submodule_url then
            -- execute('rm -rf ' .. path)
            local git_dir = module .. '/.git/modules/' .. path:match('^.-/(.+)$')
            -- execute('rm -rf ' .. git_dir)
            execute('mkdir -p $(dirname "' .. git_dir .. '")')
            if not execute('git clone --depth=1 --single-branch --branch=' .. branch .. ' --separate-git-dir ' .. git_dir .. ' ' .. module_url .. '/' .. submodule_url .. ' ' .. module .. '/' .. path) then
                io.stderr:write('can\'t clone submodule ' .. submodule .. '\n')
                return 1
            end
            path = nil
            submodule_url = nil
        end
    end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.