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


853

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

এখন, আমার বোঝাপড়াটি এটি করা git submodule updateউচিত, তবে তা হয় না। এটি কিছুই করে না (কোনও আউটপুট, সাফল্যের প্রস্থান কোড নয়)। এখানে একটি উদাহরণ:

$ mkdir foo
$ cd foo
$ git init .
Initialized empty Git repository in /.../foo/.git/
$ git submodule add ssh://user@host/git/mod mod
Cloning into mod...
user@host's password: hunter2
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 131 (delta 54), reused 0 (delta 0)
Receiving objects: 100% (131/131), 16.16 KiB, done.
Resolving deltas: 100% (54/54), done.
$ git commit -m "Hello world."
[master (root-commit) 565b235] Hello world.
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 mod
# At this point, ssh://user@host/git/mod changes; submodule needs to change too.
$ git submodule init
Submodule 'mod' (ssh://user@host/git/mod) registered for path 'mod'
$ git submodule update
$ git submodule sync
Synchronizing submodule url for 'mod'
$ git submodule update
$ man git-submodule 
$ git submodule update --rebase
$ git submodule update
$ echo $?
0
$ git status
# On branch master
nothing to commit (working directory clean)
$ git submodule update mod
$ ...

আমি চেষ্টাও করেছি git fetch mod, যা একটি আনতে চলেছে বলে মনে হচ্ছে (তবে সম্ভবত এটি সম্ভব নয়, কারণ এটি কোনও পাসওয়ার্ডের জন্য অনুরোধ জানায় না!), git logএবং git showনতুন কমিটের অস্তিত্বকে অস্বীকার করে। এখন পর্যন্ত আমি সবে মাত্র rmমডিউলটি তৈরি করেছি এবং এটি পুনরায় যুক্ত করছি, তবে এটি উভয়ই নীতিগতভাবে ভুল এবং অনুশীলনে ক্লান্তিকর।


5
ডেভিড জেডের উত্তরটি এটি করার আরও ভাল --remoteপদ্ধতির মতো বলে মনে হচ্ছে - এখন গিটের বিকল্পের মাধ্যমে আপনার যে কার্যকারিতাটি তৈরি করতে হবে তা সম্ভবত জেসনের উত্তরে "হাত দ্বারা" পদ্ধতির পরিবর্তে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করা কার্যকর হবে?
মার্ক অ্যামেরি

1
আমি @ মার্কা আমেরির সাথে অত্যন্ত সম্মত জেসন একটি কার্যনির্বাহী সমাধান দেওয়ার সময়, এটি করার উদ্দেশ্যে করা উপায় নয়, কারণ এটি সাব কমডের কমিট পয়েন্টারটিকে ভুল কমিট শনাক্তকারীকে ছেড়ে দেয়। নতুন --remoteনিশ্চিতভাবেই সময় এই সময়ে ভাল সমাধান পাওয়া যাবে এবং যেহেতু এই প্রশ্নের submodules সম্পর্কে একটি গিটহাব সারকথা থেকে লিঙ্ক করা হয়েছে, আমি এটা ভাল হবে ইনকামিং পাঠকদের নতুন উত্তর দেখার জন্য মনে হয়।
মিউট্যান্ট অ্যাক্টোপাস

hunter2পাসওয়ার্ডটির সাথে দুর্দান্ত ছোঁয়া : ও)
লফারোকো

উত্তর:


1458

git submodule updateকমান্ড আসলে গীত বলে যে আপনি প্রতিটি পরীক্ষা করার জন্য আপনার submodules ইতিমধ্যে superproject সূচী উল্লেখিত কমিট আউট চাই। আপনি যদি আপনার সাবমডিউলগুলি তাদের দূরবর্তী থেকে প্রাপ্ত সর্বশেষ প্রতিশ্রুতিতে আপডেট করতে চান , আপনাকে সরাসরি সাবমডিউলে এটি করতে হবে।

সুতরাং সংক্ষেপে:

# Get the submodule initially
git submodule add ssh://bla submodule_dir
git submodule init

# Time passes, submodule upstream is updated
# and you now want to update

# Change to the submodule directory
cd submodule_dir

# Checkout desired branch
git checkout master

# Update
git pull

# Get back to your project root
cd ..

# Now the submodules are in the state you want, so
git commit -am "Pulled down update to submodule_dir"

বা, আপনি যদি ব্যস্ত ব্যক্তি হন:

git submodule foreach git pull origin master

335
git submodule foreach git pull
ম্যাথিয়াস বাইনেস

87
@ নিক্লাস সেক্ষেত্রে ব্যবহার করুন git submodule foreach git pull origin master
ম্যাথিয়াস বাইনেস

54
এই মুহুর্তে, সংশোধনগুলিতে এই সমস্ত সংশোধনীর সাথে আমার একটি ব্যাখ্যামূলক ব্লগ পোস্ট লিখতে হবে এবং আমাকে সেখানে নির্দেশ করার জন্য আমার প্রয়োজন need অনুগ্রহ.
সুজ

25
'ফোরচ' পদ্ধতির সামান্য উন্নতি - আপনি সাবমডিউলের মধ্যে সাবমডিউলগুলি থাকতে পারে সেখানে --recursive যুক্ত করতে পারেন want তাই: git submodule foreach --recursive git pull origin master
ওরিওন এলিজিল

4
@Abdull -aসুইচ জন্য git commit"বলুন স্বয়ংক্রিয়ভাবে পর্যায় ফাইল পরিবর্তন করা এবং মোছা কমান্ড [গুলি], কিন্তু নতুন আপনি যে ফাইলগুলি গীত বলেন নি সম্পর্কে প্রভাবিত হয় না।"
Godfrzero

473

গিট 1.8.2 একটি নতুন বিকল্প বৈশিষ্ট্যযুক্ত --remote, যা ঠিক এই আচরণটি সক্ষম করে। চলমান

git submodule update --remote --merge

প্রতিটি সাবমোডিয়ালে আপস্ট্রিম থেকে সর্বশেষ পরিবর্তনগুলি এনেছে, সেগুলিকে একত্রীকরণ করবে এবং সাবমডিউলের সর্বশেষ সংশোধন পরীক্ষা করবে। ডকুমেন্টেশন যেমন রাখে:

--remote

এই বিকল্পটি শুধুমাত্র আপডেট আদেশের জন্য বৈধ। সাবমডিউলটি আপডেট করার জন্য সুপারপ্রজেক্টের রেকর্ড করা SHA-1 ব্যবহার না করে সাবমডিউলের দূরবর্তী ট্র্যাকিং শাখার স্থিতি ব্যবহার করুন।

এটি git pullপ্রতিটি সাবমোডিয়ুলে চলার সমতুল্য , যা সাধারণত আপনি চান ঠিক তেমন হয়।


4
" git pullপ্রতিটি সাবমোডিয়ুলের দৌড়ানোর সমতুল্য " স্পষ্ট করে বলতে গেলে, আপনার উত্তর এবং এর মধ্যে (ব্যবহারকারীর দৃষ্টিভঙ্গি থেকে) কোনও পার্থক্য নেই git submodule foreach git pull?
ডেনিস

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

5
আমি আশা করি আমি এই 10,000 এক্সকে উন্নত করতে পারব। গিটের ডকুমেন্টেশনে এটি কোথাও দেখানো হচ্ছে না কেন? বিশাল তদারকি।
সেরোসেস

4
আমার জন্য তারা আসলে বেশ উল্লেখযোগ্যভাবে পার্থক্য করেছিল; foreach git pullকেবলমাত্র সেগুলি পরীক্ষা করে দেখেছে, তবে সাব-মডেলের নতুন প্রতিশ্রুতিতে নির্দেশ করতে প্রধান রেপোর পয়েন্টারটি আপডেট হয়নি। কেবল --remoteএটির সাথে এটি সর্বশেষ প্রতিশ্রুতির দিকে ইঙ্গিত করে।
Ela782

5
কেন - ডুবো বিকল্প? এতে কী তফাত হয়?
এমফিনস্টাইন

126

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

git submodule update --init

বা যদি আপনার পুনরাবৃত্ত সাবমডিউলগুলি চালিত হয়:

git submodule update --init --recursive

কখনও কখনও এটি এখনও কাজ করে না, কারণ সাবমডিউলটি আপডেট হওয়ার সময় কোনও কোনওরকম আপনার স্থানীয় সাবমডিউল ডিরেক্টরিতে স্থানীয় পরিবর্তন রয়েছে।

বেশিরভাগ সময় স্থানীয় পরিবর্তন আপনার প্রতিশ্রুতিবদ্ধ হতে পারে না। এটি আপনার সাবমডিউল ইত্যাদিতে ফাইল মুছে ফেলার কারণে ঘটতে পারে etc.

git submodule update --init --recursive

5
এই সত্য উত্তর। আমি কি এটিকে কোনওভাবে আমার দূরবর্তী সংগ্রহস্থলে ঠেলাতে পারি?
মনস্টার এমএমআরপিজি

এটি নতুন সাবমডিউলগুলির জন্য কাজ করে! আমি অন্য সকলকে আপডেট করতে পারতাম তবে আমি এই কমান্ডটি চালা না করা পর্যন্ত নতুন সাবমডিউলগুলির ফোল্ডারটি খালি থাকবে।
অ্যালেক্সিস উইল্ক

1
এটি বিদ্যমান সাবমডিউলগুলির জন্য পরিবর্তনগুলি টানছে না
সের্গেই জি।

73

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

সুতরাং, আপনার ক্ষেত্রে, আপনার সাবমডিউলে সঠিক প্রতিশ্রুতিটি পাওয়া উচিত - আসুন ধরে নেওয়া যাক এর টিপ master:

cd mod
git checkout master
git pull origin master

এখন মূল প্রকল্পে ফিরে যান, সাবমডিউলটি মঞ্চস্থ করুন এবং প্রতিশ্রুতি দিন:

cd ..
git add mod
git commit -m "Updating the submodule 'mod' to the latest version"

এখন আপনার মূল প্রকল্পটির নতুন সংস্করণটি চাপ দিন:

git push origin master

এই জায়গা থেকে, অন্য কেউ যদি তাদের মূল প্রকল্পটি আপডেট করেন তবে তাদের git submodule updateজন্য সাবমডিউলটি আপডেট করা হবে, ধরে নিয়েই এটির সূচনা হয়েছে।


24

দেখে মনে হচ্ছে এই আলোচনায় দুটি ভিন্ন পরিস্থিতি একত্রিত হচ্ছে:

দৃশ্যপট 1

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

এটি যেমনটি উল্লেখ করা হয়েছে, তেমনি করা হয়েছে

git submodule foreach git pull origin BRANCH
git submodule update

পরিস্থিতি 2, যা আমি মনে করি ওপি লক্ষ্য করে

এক বা একাধিক সাবমডিউলগুলিতে নতুন জিনিসগুলি ঘটেছে, এবং আমি 1) এই পরিবর্তনগুলি টানতে চাই এবং 2) এই / এই সাবমডিউলগুলির হেড (সর্বশেষ) প্রতিশ্রুতিবদ্ধ করার জন্য প্যারেন্ট রিপোজিটরি আপডেট করুন।

এটি দ্বারা সম্পন্ন করা হবে

git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH

খুব ব্যবহারিক নয়, যেহেতু আপনাকে সমস্ত এন সাবমডিউলগুলিতে হার্ডকোড করতে হবে যেমন প্যারেন্ট রিপোজিটরির কমিট পয়েন্টার আপডেট করার জন্য একটি স্ক্রিপ্ট।

প্রতিটি সাবমোডিয়ুলের মাধ্যমে একটি স্বয়ংক্রিয় পুনরাবৃত্তিটি দুর্দান্ত হবে git add, সাব-মডুলের (গুলি) এর প্রধান দিকে নির্দেশ করতে প্যারেন্ট রিপোজিটরি পয়েন্টার (ব্যবহার করে ) আপডেট করে ।

এর জন্য, আমি এই ছোট বাশ লিপি তৈরি করেছি:

git-update-submodules.sh

#!/bin/bash

APP_PATH=$1
shift

if [ -z $APP_PATH ]; then
  echo "Missing 1st argument: should be path to folder of a git repo";
  exit 1;
fi

BRANCH=$1
shift

if [ -z $BRANCH ]; then
  echo "Missing 2nd argument (branch name)";
  exit 1;
fi

echo "Working in: $APP_PATH"
cd $APP_PATH

git checkout $BRANCH && git pull --ff origin $BRANCH

git submodule sync
git submodule init
git submodule update
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"

for i in $(git submodule foreach --quiet 'echo $path')
do
  echo "Adding $i to root repo"
  git add "$i"
done

git commit -m "Updated $BRANCH branch of deployment repo to point to latest head of submodules"
git push origin $BRANCH

এটি চালাতে, কার্যকর করুন

git-update-submodules.sh /path/to/base/repo BRANCH_NAME

বিবরণাদি

প্রথমত, আমি ধরে নিই যে rep ব্রাঞ্চ (দ্বিতীয় যুক্তি) নামের শাখাটি সমস্ত ভান্ডারে রয়েছে। এটিকে আরও জটিল করে তুলতে নির্দ্বিধায়।

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

git checkout $BRANCH && git pull --ff origin $BRANCH

তারপরে কিছু সাবমোডিয়াল আরম্ভ করা প্রয়োজন হতে পারে, যদি নতুন সাবমডিউল যুক্ত করা থাকে বা এখনও আরম্ভ না করা হয়:

git submodule sync
git submodule init
git submodule update

তারপরে আমি সমস্ত সাবমোডিয়ুল আপডেট / টানছি:

git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"

কয়েকটি জিনিস লক্ষ্য করুন: প্রথমত, আমি কিছু গিট কমান্ড ব্যবহার করে শৃঙ্খল করছি &&- এর অর্থ পূর্ববর্তী কমান্ডটি অবশ্যই ত্রুটি ছাড়াই কার্যকর করা উচিত।

একটি সম্ভাব্য সফল টানার পরে (যদি নতুন কোনও জিনিস রিমোটে পাওয়া যায়) তবে আমি নিশ্চিত হয়েছি যে কোনও সম্ভাব্য মার্জ-কমিট ক্লায়েন্টের পিছনে থাকবে না। আবার, এটি কেবল তখনই ঘটে যখন কোনও টান আসলে নতুন জিনিস নিয়ে আসে।

অবশেষে, ফাইনালটি || trueনিশ্চিত করছে যে ত্রুটিগুলিতে স্ক্রিপ্ট অব্যাহত রয়েছে। এই কাজটি করার জন্য, পুনরাবৃত্তির প্রত্যেকটি জিনিসই অবশ্যই ডাবল-কোটগুলিতে আবৃত থাকতে হবে এবং গিট কমান্ডগুলি প্রথম বন্ধনীতে আবৃত হবে (অপারেটর নজরে))

আমার প্রিয় অংশ:

for i in $(git submodule foreach --quiet 'echo $path')
do
  echo "Adding $i to root repo"
  git add "$i"
done

সমস্ত সাবমোডিয়ুলগুলিকে আইট্রেট করুন - এর সাহায্যে --quietএটি 'মোডুএলএপিএটিএইচপিএইচপি প্রবেশ করায়' আউটপুট সরিয়ে দেয়। 'echo $path'(অবশ্যই একক-কোটায় থাকতে হবে) ব্যবহার করে সাবমডিউলের দিকে আউটপুট লিখতে হবে।

আপেক্ষিক সাব-মডিউল পাথগুলির এই তালিকাটি একটি অ্যারে ( $(...)) -র মধ্যে ধরা পড়ে - অবশেষে এটিকে পুনরাবৃত্তি করুন এবং git add $iপ্যারেন্টের সংগ্রহস্থল আপডেট করতে করুন।

অবশেষে, কিছু বার্তার সাথে একটি প্রতিশ্রুতি দিয়ে বোঝানো হচ্ছে যে প্যারেন্টের সংগ্রহস্থলটি আপডেট হয়েছিল। কিছু না করা থাকলে এই প্রতিশ্রুতিটি ডিফল্টরূপে উপেক্ষা করা হবে। এটিকে উত্সাহিত করুন, এবং আপনি শেষ করেছেন।

আমার একটি জেনকিন্স চাকরিতে এটি চালিত একটি স্ক্রিপ্ট রয়েছে যা পরে একটি নির্ধারিত স্বয়ংক্রিয় মোতায়েনের জন্য শৃঙ্খলাবদ্ধ এবং এটি একটি কবজির মতো কাজ করে।

আমি আশা করি এটি কারও উপকারে আসবে।


2
! @ # $% SO আমরা আপনার অনুরূপ স্ক্রিপ্ট ব্যবহার করছি; একটি নোট: it `ule গিট সাবমডিউল ফোরচ - কুইট 'প্রতিধ্বনি` পথ' 'for `এর পরিবর্তে আমরা লুপগুলির জন্য it`। গিট সাবমডিউল ফোর্যাচ - রিসার্চ - - পিওটডব্লিউডি `` use ব্যবহার করি। pwdকমান্ড প্রতিটি submodule বর্তমানে সঠিক 'সুনির্দিষ্ট পাথ' ছাপে; একটি বৃহত প্রকল্পে উপস্থিত থাকতে পারে এমন সাবমোডিয়াল-ইন-সাব-মডিউলস -... সহ --recursiveআমরা সমস্ত সাবমোডিয়ুল পরিদর্শন করেছি তা নিশ্চিত করে । উভয় পদ্ধতিই ডিরেক্টরিগুলির মধ্যে ফাঁকা স্থান অন্তর্ভুক্ত করতে সমস্যা সৃষ্টি করে, উদাহরণস্বরূপ /c/Users/Ger/Project\ Files/...নীতি হ'ল আমাদের প্রকল্পগুলির কোথাও হোয়াইটস্পেস ব্যবহার করা উচিত নয়
জের হোবল্ট

2
এটি দুর্দান্ত, এবং আপনি ঠিকই বলেছেন যে প্রশ্নটি কী তা সম্পর্কে কিছু উত্তরে একটি ভুল বোঝাবুঝি রয়েছে, কিন্তু ডেভিড জেডের দুর্দান্ত উত্তরের দ্বারা উল্লেখ করা হয়েছে, ২০১৩ সালের মাঝামাঝি থেকে কার্যকারিতা গিটে তৈরি হওয়ার পরে আপনার স্ক্রিপ্টটি অপ্রয়োজনীয় when তারা --remoteবিকল্প যুক্ত করেছে । git submodule update --remoteআপনার স্ক্রিপ্টটি প্রায় এমনভাবে আচরণ করে।
মার্ক আমেরিকা

@ জারহব্বেল্ট ধন্যবাদ আপনারা ঠিক বলেছেন, আমাদের কাছে মাত্র 1 টি সাবমোডিয়ুল রয়েছে, তাই আমি এটিকে পুনরাবৃত্ত করার জন্য কখনও ভাবিনি। প্রত্যাশার মতো এটি কাজ করে যাচাই করার সুযোগ পাওয়ার আগে আমি স্ক্রিপ্টটি আপডেট করব না, তবে অবশ্যই আমার স্ক্রিপ্ট সাব-সাব-মডিউলগুলিকে ইনগ্রোর করবে। ফোল্ডারগুলির ফাঁকা জায়গাগুলির মতো এটি অবশ্যই এড়িয়ে যাওয়ার মতো কিছু মনে হচ্ছে! : এস
ফ্রেডেরিক স্ট্রাক-শোইনিং

@ মার্কআমেরি আপনার মতামতের জন্য ধন্যবাদ আমি তবে 1 টি ইস্যু দেখতে পাচ্ছি: উপ-তর্কটি সাবমডিউলের জন্য শাখা নির্দিষ্ট করতে সক্ষম হচ্ছে না। গিট ম্যানুয়াল থেকে: The remote branch used defaults to master, but the branch name may be overridden by setting the submodule.<name>.branch option in either .gitmodules or .git/config (with .git/config taking precedence).আমি যখনই মাস্টারের চেয়ে অন্য শাখায় এটি করতে চাই প্রতিবার .গিটমডিউলগুলি না। গিট / কনফিগার করতে চাই না। তবে আমি কি কিছু মিস করেছি? এছাড়াও, পদ্ধতিটি পুনরাবৃত্ত মার্জগুলি প্রয়োগ করে বলে মনে হচ্ছে (এইভাবে দ্রুত এগিয়ে যাওয়ার সম্ভাবনা হারাতে পারে না)।
ফ্রেডেরিক স্ট্রাক-শুকিং

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

19

সাবমোডুলগুলি আনার জন্য সরল এবং সহজ:

git submodule update --init --recursive

এবং এখন সেগুলি সর্বশেষতম মাস্টার শাখায় আপডেট করা (উদাহরণস্বরূপ):

git submodule foreach git pull origin master

12

দ্রষ্টব্য, সাব-মডিউল কমিটগুলি আপডেট করার আধুনিক ফর্মটি হ'ল:

git submodule update --recursive --remote --merge --force

পুরানো ফর্মটি ছিল:

git submodule foreach --quiet git pull --quiet origin

বাদে ... এই দ্বিতীয় রূপটি আসলে "শান্ত" নয়।

দেখুন কমিট a282f5a (12 এপ্রিল 2019) দ্বারা গান Nguyễn গান Thái আরো Ngọc গান Duy ( pclouds)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট f1c9f6c , 25 এপ্রিল 2019)

submodule foreach: ঠিক " <command> --quiet" সম্মান করা হচ্ছে না

রবিন তা জানিয়েছে

git submodule foreach --quiet git pull --quiet origin

আসলেই আর চুপচাপ নয়।
আগে এটি শান্ত হওয়া উচিত fc1b924 ( submodule: বন্দর submodulesubcommand ' foreachশেল থেকে সি, 2018-05-10 করার', গীত v2.19.0-rc0) কারণ parseoptঘটনাক্রমে অপশন তারপর খাওয়া যাবে না।

" git pull" এমনভাবে আচরণ করে --quietযা দেওয়া হয়নি।

এই ঘটনা কারণ parseoptsubmodule--helperউভয় বিশ্লেষণ করতে চেষ্টা করবে --quietঅপশন যেন তারা foreach এর বিকল্প, হয় না git-pullএর।
বিভক্ত বিকল্পগুলি কমান্ড লাইন থেকে সরানো হয়েছে। সুতরাং যখন আমরা পরে টান না, আমরা ঠিক এই সম্পাদন

git pull origin

সাবমডিউল সহায়ককে কল করার সময়, "" --"এর সামনে" git pull"যুক্ত করা parseoptএমন বিকল্পগুলি পার্সিংয়ের জন্য থামবে যা সত্যিকারের নয় submodule--helper foreach

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

এটির সময়ে, আমি --অন্যান্য সাবকম্যান্ডগুলিতে " $@" পাস করে " " এও যুক্ত করি submodule--helper। " $@" এই ক্ষেত্রে পথগুলি এবং এর সম্ভাবনা কম --something-like-this
তবে বিন্দুটি এখনও দাঁড়িয়ে আছে, git-submoduleবিশ্লেষণ করেছে এবং শ্রেণীবদ্ধ করেছে কী কী বিকল্পগুলি রয়েছে, কোনটি পাথগুলি।
submodule--helperরাস্তাগুলি git-submoduleযেমন দেখায় তেমন পথগুলি কখনই বিকল্প হিসাবে বিবেচনা করা উচিত নয় ।


এবং গিট 2.23 (কিউ 3 2019) আরেকটি সমস্যা সমাধান করেছে: " git submodule foreach" প্রতিটি সাবমডিউলে সঠিকভাবে চালানোর জন্য কমান্ডের কাছে দেওয়া কমান্ড লাইন বিকল্পগুলি সুরক্ষা দেয় না, যখন " --recursive" বিকল্পটি ব্যবহার করা হত।

দেখুন 30db18b কমিট দ্বারা (24 জুন 2019) Morian সনেট ( momoson)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 968eecb , 09 জুলাই 2019)

submodule foreach: বিকল্পগুলির পুনরাবৃত্তি ঠিক করুন

কল করা হচ্ছে:

git submodule foreach --recursive <subcommand> --<option>

বিকল্পটি --<option>অজানা বলে উল্লেখ করে একটি ত্রুটি বাড়ে submodule--helper
এটি অবশ্যই কেবল তখনই যখন <option>কোনও বৈধ বিকল্প নয় git submodule foreach

এর কারণ হ'ল, উপরোক্ত কলটি অভ্যন্তরীণভাবে সাবমডিউলে কল - সহায়ক হিসাবে কল করা হয়েছে:

git submodule--helper foreach --recursive \
    -- <subcommand> --<option>

এই কলটি প্রথম স্তরের সাবমোডিয়ুলের অভ্যন্তরে তার বিকল্পের সাথে সাবকম্যান্ডটি কার্যকর করে শুরু হয় এবং submodule foreachকলটির পরবর্তী পুনরাবৃত্তিটি কল করে অবিরত থাকে

git --super-prefix <submodulepath> submodule--helper \
   foreach --recursive <subcommand> --<option>

প্রথম স্তরের সাবমডিউলের ভিতরে। মনে রাখবেন সাবকম্যান্ডের সামনের ডাবল ড্যাশ অনুপস্থিত।

এই সমস্যাটি কেবল সম্প্রতি উত্থিত হতে শুরু করে, কারণ PARSE_OPT_KEEP_UNKNOWNআর্গুমেন্ট পার্সিংয়ের পতাকাটিgit submodule foreach কমিট এ 282f5a তে সরানো হয়েছিল ।
সুতরাং, অজানা বিকল্পটি এখন সম্পর্কে অভিযোগ করা হয়েছে, কারণ যুক্তিটি পার্সিংটি ডাবল ড্যাশ দ্বারা সঠিকভাবে শেষ হয় নি।

এই প্রতিশ্রুতি পুনরাবৃত্তির সময় সাবকম্যান্ডের সামনে ডাবল ড্যাশ যুক্ত করে সমস্যার সমাধান করে।


7
git pull --recurse-submodules

এটি সর্বশেষতম কমিটগুলি টানবে।


4

আমার ক্ষেত্রে, আমি gitসর্বশেষতমটিতে আপডেট করতে চেয়েছিলাম এবং একই সময়ে কোনও অনুপস্থিত ফাইল পুনরায় তৈরি করতে চাই।

নিম্নলিখিতটি নিখোঁজ হওয়া ফাইলগুলি পুনরুদ্ধার করেছে (ধন্যবাদ --forceযার জন্য এখানে উল্লেখ করা হয়নি বলে মনে হয়) তবে এটি কোনও নতুন প্রতিশ্রুতি টানেনি:

git submodule update --init --recursive --force

এটি করেছে:

git submodule update --recursive --remote --merge --force


3

@ জেসন একটি উপায়ে সঠিক তবে পুরোপুরি নয়।

হালনাগাদ

নিবন্ধিত সাবমোডিয়ুলগুলি আপডেট করুন, অর্থাৎ ক্লোন অনুপস্থিত সাবমোডিয়ুলগুলি এবং ধারণকৃত সংগ্রহস্থলের সূচীতে নির্দিষ্ট প্রতিশ্রুতিটি চেকআউট করুন। এটি সাবমোডিয়ালগুলি হেডকে বিচ্ছিন্ন করে দেবে --rebase বা - নিমজ্জন নির্দিষ্ট না করা বা কী সাবমডিউল না দেওয়া পর্যন্ত $ name.update পুনরায় সেট করা বা মার্জ করতে সেট করা আছে।

সুতরাং, git submodule updateচেকআউট করে, তবে এটি ধারণকৃত সংগ্রহস্থলের সূচকে প্রতিশ্রুতিবদ্ধ। এটি এখনও নতুন প্রতিশ্রুতি প্রবাহ সম্পর্কে মোটেই জানে না। সুতরাং আপনার সাবমডিউলে যান, আপনি যে প্রতিশ্রুতিবদ্ধ তা পেতে এবং প্রধান সংগ্রহস্থলগুলিতে আপডেট করা সাবমডিউল রাষ্ট্র প্রতিশ্রুতিবদ্ধ করুন এবং তারপরে এটি করুন git submodule update


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


2

আপনি যদি হোস্ট শাখাটি জানেন না, এটি তৈরি করুন:

git submodule foreach git pull origin $(git rev-parse --abbrev-ref HEAD)

এটি মূল গিট সংগ্রহস্থলের একটি শাখা পাবে এবং তারপরে প্রতিটি উপ-মডেলের জন্য একই শাখার একটি টান তৈরি করবে।


0

আপনি যদি masterপ্রতিটি সাবমডিউলের জন্য চেকআউট শাখার সন্ধান করছেন - আপনি সেই উদ্দেশ্যে নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

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