গিট টান স্বয়ংক্রিয়ভাবে সাবমোডিয়ুল আপডেট করার কোনও উপায় আছে?


203

স্বয়ংক্রিয়ভাবে থাকার কোনও উপায় আছে git submodule update(বা git submodule update --initযখনই git pullসম্পন্ন হয় তখন কল করা হয়?

এটির জন্য গিট কনফিগার সেটিং বা একটি গিট ওরফেস খুঁজছেন।


4
সম্পর্কিত: stackoverflow.com/questions/1899792/...
philfreo

1
কেন গিট ওরফে শেল ওরফে অপেক্ষা ভাল?
জানুন

20
গিট এলিয়াসগুলি দুর্দান্ত কারণ এটি "গিট" নেমস্পেসে কমান্ডটি আবদ্ধ করে। আপনি পাশাপাশি জিজ্ঞাসা করতে পারেন কেন সমস্ত গিট কমান্ডগুলির নিজস্ব নাম থাকার পরিবর্তে "গিট" দিয়ে শুরু হয়।
লিলি ব্যালার্ড

5
যে কেউ এটি সন্ধানের জন্য, উচ্চ-ভোট প্রাপ্ত উত্তরগুলি বর্তমানে পুরানো। কেনের উত্তরটি নির্ভুল: stackoverflow.com/a/49427199/3499424
জন নিউহাউস

উত্তর:


176

গিট ২.১৪ হিসাবে আপনি ব্যবহার করতে পারেন git pull --recurse-submodules(এবং এটি আপনার পছন্দসই নাম হিসাবে ব্যবহার করুন )।

গিট 2.15 হিসাবে , আপনি submodule.recurseপছন্দসই আচরণ সক্ষম করতে সত্যতে সেট করতে পারেন।

আপনি এটি চালিয়ে বিশ্বব্যাপী করতে পারেন:

git config --global submodule.recurse true

3
2.16 এর সাথে নিশ্চিত হওয়া, এটি সত্যে সেট git pullকরাও একটি উপ-মডেল আনবে এবং চালিত করবে submodule update। এটি এখনই গ্রহণযোগ্য উত্তর হওয়া দরকার
জন নিউউউস

1
বিশ্বব্যাপী এটি সেট করতে:git config --global submodule.recurse true
শীতকালীন সমাধানগুলি

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

9
তাদের git cloneপাশাপাশি এটি সক্ষম করা উচিত । এবং এটি ডিফল্টরূপে চালু করুন। অন্যথায়, সবসময়
সাবমডিউলগুলি

1
@CiroSantilli新疆改造中心法轮功六四事件Santilli Git কমান্ড (মত commit, fetch, pull, ইত্যাদি) শুধুমাত্র বর্তমান সংগ্রহস্থলের প্রয়োগ করা ডিজাইন করা হয়। একটি সাবমডিউল হ'ল আরেকটি সংগ্রহস্থল এবং ডিফল্টরূপে প্যারেন্ট-রেপোজিটরিতে চালিত কমান্ড দ্বারা প্রভাবিত হওয়া উচিত নয়। এটি গিট-বিকাশকারী একধরণের ডিজাইন-সিদ্ধান্ত decision
এনিয়ন

113

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

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

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

4
আপনি যে সমস্ত গিট রেপো ব্যবহার করেন সেগুলির জুড়ে এই উপনামটি চাইলে "গিট কনফিগারেশন - গ্লোবাল" ব্যবহার করতে ভুলবেন না
yoyo

43

গিট ১..5.৫ দিয়ে শুরু করা আপনার নিজের পছন্দ মতো ডিফল্টরূপে স্বয়ংক্রিয়ভাবে সাবমডিউলগুলি আপডেট করা উচিত।

[সম্পাদনা: মন্তব্যগুলি প্রতি: নতুন 1.7.5 আচরণ স্বয়ংক্রিয়ভাবে হয় আনতে submodules জন্য সর্বশেষ করে, কিন্তু না করতে আপডেট তাদের (ইন git submodule updateইন্দ্রিয়)। সুতরাং এই উত্তরের তথ্যগুলি পটভূমি হিসাবে প্রাসঙ্গিক, তবে এটি নিজেই একটি সম্পূর্ণ উত্তর নয়। একটি কমান্ডে সাবমোডিয়ুলগুলি টানতে এবং আপডেট করতে আপনার এখনও একটি উলামের প্রয়োজন]]

ডিফল্ট আচরণ, "অন-ডিমান্ড" হ'ল সাব-মডিউলগুলি আপডেট করা যখনই আপনি সাবডমুলেট কমিটকে আপডেট করে এমন কোনও কমিট আনেন এবং এই কমিট ইতিমধ্যে আপনার স্থানীয় ক্লোনটিতে অবস্থিত নয়।
আপনি এটি প্রতিটি আনতে বা কখনই আপডেট করতে পারবেন না (প্রাক-1.7.5 আচরণ আমি ধরে নিই)।
এই আচরণটি পরিবর্তন করার জন্য কনফিগার বিকল্পটি fetch.recurseSubmodules

এই বিকল্পটি হয় বুলিয়ান মান বা সেট করতে পারে on-demand
একটি বুলিয়ান ধার্য আচরণ পরিবর্তন fetchএবং pullsubmodules মধ্যে নিঃশর্তভাবে recurse যখন যখন মিথ্যাতে সেট এ সব সত্যতে বা recurse না সেট।

on-demand(ডিফল্ট মান) এ সেট করা থাকলে fetchএবং pull কেবল তখনই একটি জনবহুল সাবমডিউলে পুনরাবৃত্তি হবে যখন এর সুপারপ্রজেক্টটি একটি প্রতিশ্রুতি পুনরুদ্ধার করে যা সাবমডিউলের রেফারেন্স আপডেট করে

দেখা:

আরও তথ্যের জন্য.

git fetch --recurse-submodules[=yes|on-demand|no]

27
সতর্কতা: নীচের উত্তরগুলি ব্যাখ্যা হিসাবে, এটি কেবল স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি এনেছে, আপনাকে এখনও একটি সাব মড্যুল আপডেট করতে হবে - সুতরাং উপনামের উত্তরটি সঠিক।
আর্টেম

4
@ আর্টেমটি সঠিক is এই উত্তরটি কার্যকর হলেও পুরো প্রশ্নের সমাধান করে না। এই সেটিংটি কেবল একটি করে git fetchনা, একটি করে git submodule update
অ্যান্ড্রু ফেরিয়ার

2
এই উত্তরটি অত্যন্ত প্রতারণামূলক। এমনকি এটির git pullপরিবর্তে ব্যবহৃত git fetchহলেও, এই বিকল্পটি কেবল আনয়নকে পুনরাবৃত্ত করে তোলে । সাবমোডিয়ুলগুলিতে যা প্রতিশ্রুতি দেওয়া হয়েছে তা কোনও পরিবর্তন করবে না change সুতরাং git submodule updateহিসাবে @Artem দ্বারা লক্ষনীয়, এখনও প্রয়োজন।
মার্ক আমেরি

31

আমি অবাক হয়েছি কেউ এই কাজ করার জন্য গিট হুক ব্যবহার করে উল্লেখ করেনি!

কেবলমাত্র নামযুক্ত ফাইলগুলি post-checkoutএবং সম্পর্কিত ডিরেক্টরিতে post-mergeআপনার .git/hooksডিরেক্টরিতে যুক্ত করুন এবং সেগুলির প্রতিটিতে নিম্নলিখিতটি লিখুন:

#!/bin/sh
git submodule update --init --recursive

যেহেতু আপনি স্পষ্টতই একটি উপনামের জন্য জিজ্ঞাসা করেছেন, ধরে নিচ্ছেন যে আপনার কাছে এটি অনেকগুলি সংগ্রহস্থলের জন্য রয়েছে তাই আপনি একটি উপকরণ তৈরি করতে পারেন যা এটি আপনার .git/hooksজন্য একটি সংগ্রহস্থলের সাথে যুক্ত করে ।


2
এটিকে বিশ্বব্যাপী সেটিং করার কোনও উপায় আছে কি? অথবা একটি সংগ্রহস্থল চেক করার সময় আপনি স্বয়ংক্রিয়ভাবে পাবেন?
রাউল স্টেফেন

3
গিটের সর্বশেষ প্রকাশ, ২.৯, হুক ডিরেক্টরিতে নামের একটি সেটিংস যুক্তcore.hooksPath করেছে , git-configআরও তথ্যের জন্য ডকগুলি দেখুন।
ট্যালিন্যাট

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

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

1
এই সমাধান আমার প্রথম চিন্তা ছিল, কিন্তু তারপর আমি বুঝতে পারলাম এটা যারা ব্যবহার আবরণ না git pull --rebase:(
ভাজ

8

কেভিন বলার্ডের পরামর্শ অনুসারে একটি উপাধি পুরোপুরি ভাল সমাধান। কেবলমাত্র সেখানে অন্য বিকল্পটি টস করতে, আপনি একটি মার্জ পোস্ট পরবর্তী হুকও ব্যবহার করতে পারেন যা কেবল চালায় git submodule update [--init]


7

আপনি গিট কমান্ডের জন্য একটি উপনাম তৈরি করতে পারেন যা স্বয়ংক্রিয়ভাবে সাবমডিউল আপডেটিং পরিচালনা করে। আপনার .bashrc এ নিম্নলিখিতগুলি যুক্ত করুন

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

1
গিটের জন্য একটি উপনামের পরিবর্তে, আপনি ওরফে কমান্ডের মাধ্যমে বা গিট- (গিট-বেস্টমডিউল) দিয়ে শুরু হওয়া আপনার পথে কমান্ড তৈরির মাধ্যমে গিটের সাথে উপকরণ যুক্ত করতে পারেন
idbrii

7

অন্যরা যেমন উল্লেখ করেছে, আপনি সহজেই এটি দিয়ে সেট করতে পারেন:

git config --global submodule.recurse true

তবে, আপনি যদি আমার মতো হন এবং আরও জটিল .gitconfigসেটআপ থাকে (আমার মূল ~/.gitconfigফাইলটি includeঅন্য .gitconfigফাইলগুলিতে লোড করতে ব্যবহার করে), এবং আপনি কখনই কমান্ড-লাইন gitকনফিগারেশন ফর্ম্যাট এবং ফর্ম্যাটের মধ্যে রূপান্তর করবেন তা মনে করতে পারেন না .gitconfig, কীভাবে এটি যুক্ত করবেন তা এখানে রয়েছে আপনার যে কোনও .gitconfigফাইলের কাছে:

[submodule]
  recurse = true

0

আমি কীভাবে সাবমডিউলগুলি এবং নেস্টেড সাবমোডিয়ুলগুলি আপডেট করতে পেরেছি তার একমাত্র উপায়:

git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;

বন্ধনীগুলির কারণে আমি টার্মিনালের মাধ্যমে ওরফে তৈরির জন্য সংগ্রাম করে যাচ্ছিলাম তাই বিশ্বব্যাপী আমাকে নিজেই এটি .gitconfig এ যুক্ত করতে হয়েছিল:

[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"

কমান্ডগুলি বা উপনামটি স্বয়ংক্রিয়ভাবে কীভাবে চালানো যায় তার জন্য কোনও পরামর্শ?

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