গিট সাবমড্যুল যুক্ত করার সময় আমি কীভাবে একটি শাখা / ট্যাগ নির্দিষ্ট করতে পারি?


755

কিভাবে git submodule add -bকাজ করে?

নির্দিষ্ট শাখার সাথে সাবমডিউল যুক্ত করার পরে, একটি নতুন ক্লোন করা সংগ্রহস্থল (পরে git submodule update --init) একটি নির্দিষ্ট প্রতিশ্রুতিতে থাকবে, শাখা নিজেই নয় ( git statusসাবমডিউলে "বর্তমানে কোনও শাখায় নেই" দেখায়)।

আমি সাবমডিউলের শাখা বা কোনও নির্দিষ্ট প্রতিশ্রুতি সম্পর্কে .gitmodulesবা তার .git/configসম্পর্কে কোনও তথ্য খুঁজে পাচ্ছি না , সুতরাং গিট কীভাবে এটি নির্ধারণ করবেন?

এছাড়াও, শাখার পরিবর্তে কোনও ট্যাগ নির্দিষ্ট করা সম্ভব?

আমি সংস্করণ 1.6.5.2 ব্যবহার করছি।


3
আপনার যদি একটি বিদ্যমান সাবমডিউল থাকে যা এখনও কোনও শাখা ট্র্যাক করছে না , তবে আপনি চান এখন এটি একটি শাখা ট্র্যাক করবে ... নীচে আমার উত্তরটি দেখুন
ভোনসি

উত্তর:


744

দ্রষ্টব্য: গিট 1.8.2 শাখাগুলি ট্র্যাক করার সম্ভাবনা যুক্ত করেছে। নীচে কিছু উত্তর দেখুন।


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

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

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

আপনি যদি সাবমডিউলটিকে একটি নির্দিষ্ট ট্যাগে স্থানান্তর করতে চান:

cd submodule_directory
git checkout v1.0
cd ..
git add submodule_directory
git commit -m "moved submodule to v1.0"
git push

তারপরে, অন্য বিকাশকারী যিনি উপ-মডেল_ডাইরেক্টরিটি সেই ট্যাগটিতে পরিবর্তন করতে চান, এটি করেন

git pull
git submodule update --init

git pullপরিবর্তনগুলি যা তাদের সাবমডিউল ডিরেক্টরিকে নির্দেশ করে। git submodule updateআসলে নতুন কোডে একীভূত হয়।


8
এটি একটি খুব ভাল ব্যাখ্যা, ধন্যবাদ! এবং অবশ্যই, আপনার উত্তরটি পড়ার পরে, আমি বুঝতে পেরেছিলাম যে প্রতিশ্রুতিটি নিজেই সাবমডুলের (সাবমডিউল / .জিজিটি / হেড) ভিতরে সংরক্ষিত হয়েছে।
ইভান

4
এটি গিট 1.7.4.4 এ কাজ করছে বলে মনে হচ্ছে না। cd my_submodule; git checkout [ref in submodule's repositoryফলন fatal: reference is not a tree: ...। এটি gitকেবলমাত্র পিতামাতার সংগ্রহস্থলে কাজ করবে।
জেমস এ রোজেন 21

3
এমনকি প্রায়শই আপডেট হওয়া প্রকল্পগুলির জন্য গিট সাবমডিউলগুলি ব্যবহার করা ভাল। লিনাক্স কার্নেল এটি ব্যবহার করে এবং এটি এতটা খারাপ নয়

10
কি git checkout v1.0একটি শাখা বা একটি ট্যাগ?
বার্নহার্ড ডাবলার

8
একটি প্রতিশ্রুতিতে একটি মানব পঠনযোগ্য ওরফে একটি ট্যাগ বিবেচনা করুন। এবং একটি প্রতিশ্রুতিবদ্ধ প্রতিটি ফাইলের জন্য নির্দিষ্ট রাষ্ট্রের একটি সেট। কোনও শাখা মূলত একই জিনিস যা আপনি এতে পরিবর্তন করতে পারেন তা ছাড়া।
deadbabykitten

656

আমি এখানে একটি উত্তর যুক্ত করতে চাই যা সত্যই অন্য উত্তরগুলির একত্রিত, তবে আমি মনে করি এটি আরও সম্পূর্ণ হতে পারে।

আপনি যখন জানবেন যে এই দুটি জিনিস আপনার কাছে একটি গিট সাবমডিউল রয়েছে।

  1. আপনার .gitmodulesমত এন্ট্রি আছে:

    [submodule "SubmoduleTestRepo"]
        path = SubmoduleTestRepo
        url = https://github.com/jzaccone/SubmoduleTestRepo.git
    
  2. আপনার গিট সংগ্রহস্থলে আপনার একটি উপ-মডেল অবজেক্ট (এই উদাহরণে সাবমডিউলটেষ্টারপো নামকরণ করা হয়েছে) রয়েছে। গিটহাব এগুলিকে "সাবমডিউল" অবজেক্ট হিসাবে দেখায়। অথবা git submodule statusকমান্ড লাইন থেকে করুন। গিট সাবমডিউল অবজেক্টগুলি হ'ল বিশেষ ধরণের গিট অবজেক্ট এবং তারা একটি নির্দিষ্ট কমিটের জন্য এসএএএ সম্পর্কিত তথ্য রাখে।

    আপনি যখনই একটি করেন git submodule update, এটি আপনার সাবমডিউলটিকে কমিট থেকে লিখিত সামগ্রী দিয়ে পপুলেট করবে। এটি তথ্যের কারণে কমিটগুলি কোথায় সন্ধান করবে তা জানে .gitmodules

    এখন, সমস্ত -bকাজটি হ'ল আপনার .gitmodulesফাইলে একটি লাইন যুক্ত করা । সুতরাং একই উদাহরণ অনুসরণ করে, এটি দেখতে এরকম হবে:

    [submodule "SubmoduleTestRepo"]
        path = SubmoduleTestRepo
        url = https://github.com/jzaccone/SubmoduleTestRepo.git
        branch = master
    

    দ্রষ্টব্য: একটি শাখার নাম কেবল একটি .gitmodulesফাইলে সমর্থিত তবে SHA এবং ট্যাগ সমর্থিত নয়! (তার পরিবর্তে, প্রতিটি মডিউলের শাখার দায়বদ্ধতা " git add ." ব্যবহার করে ট্র্যাক এবং আপডেট করা যেতে পারে , উদাহরণস্বরূপ git add ./SubmoduleTestRepo, এবং আপনাকে .gitmodulesপ্রতিবার ফাইল পরিবর্তন করার দরকার নেই )

    সাবমডিউল অবজেক্টটি এখনও একটি নির্দিষ্ট কমিটের দিকে নির্দেশ করছে। কেবলমাত্র -bবিকল্পটি আপনাকে কিনে তা হ'ল --remoteভোগেলার উত্তর অনুসারে আপনার আপডেটে একটি পতাকা যুক্ত করার ক্ষমতা :

    git submodule update --remote
    

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

    git submodule add -bকোনও শাখার সাথে সবকিছু আপ টু ডেট রাখার মতো কোনও যাদুবিদ্যার উপায় নয়। এটি কেবল .gitmodulesফাইলের কোনও শাখা সম্পর্কে তথ্য যুক্ত করে এবং উপ- মডেল অবজেক্টটিকে জনসংখ্যার আগে নির্দিষ্ট শাখার সর্বশেষ প্রতিশ্রুতিতে আপডেট করার বিকল্প দেয়।


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

12
এই শাখা ট্র্যাকিং এছাড়াও ট্যাগ সঙ্গে কাজ করে ? একটি শাখা পরিবর্তে আমি আমার একটি ট্যাগে নিদিষ্ট .gitmodulesএবং করছেন পরে $ git submodule update --init --remote TestModuleআমি বলার অপেক্ষা রাখে না একটি ত্রুটি পেয়েছিলাম fatal: Needed a single revisionএবং Unable to find current origin/TestTag revision in submodule path 'TestModule'। একটি বাস্তব শাখা দিয়ে এটি করার সময় এটি কাজ করে। .gitmodulesসঠিক প্রতিশ্রুতি নির্দিষ্ট না করেই কি কোনও ট্যাগ নির্দিষ্ট করার জন্য রয়েছে?
হুট

5
এটি কাজ করে না বলে মনে হচ্ছে। আমি হ্যাশ আপডেট করে .gitmodulesদৌড়ে এসেছি git submodule updateআর কিছুই হয়নি?
সিএমসিডিগ্রাগনকাই

2
একরকম এটি আমার পক্ষে কাজ করে না। কোনও SHA কমিট আইডির সাহায্যে আমি সর্বদা একটি ত্রুটি পাই "বর্তমান সংশোধনটি খুঁজে পেতে অক্ষম (আমি HEAD এর সংশোধন নম্বর এবং এটির সঠিকটি দ্বিগুণ পরীক্ষা করেছি)। তবে আমি যদি মাস্টার ব্যবহার করি তবে এটি কার্যকর হয়
ইনফোক্লগড

2
শাখার বৈশিষ্ট্যে কোনও এসএএল প্রবেশ করা আমার পক্ষেও কার্যকর হয় না for এই ব্যবহারটি ডক্স দ্বারাও সমর্থিত নয় : git-scm.com/docs/gitmodules
জাকব বোচেনস্কি

338

(গিট 2.22, কিউ 2 2019, চালু হয়েছে git submodule set-branch --branch aBranch -- <submodule_path>)

মনে রাখবেন যে আপনার যদি একটি বিদ্যমান সাবমডিউল থাকে যা এখনও কোনও শাখা ট্র্যাক করছে না , তবে ( যদি আপনার 1.8.2+ গিট থাকে ):

  • নিশ্চিত হয়ে নিন যে পিতামাতার রেপো জানেন যে এর সাব-মডুল এখন একটি শাখা ট্র্যাক করে:

    cd /path/to/your/parent/repo
    git config -f .gitmodules submodule.<path>.branch <branch>
    
  • আপনার সাবমডিউলটি সেই শাখার সর্বশেষে রয়েছে তা নিশ্চিত করুন:

    cd path/to/your/submodule
    git checkout -b branch --track origin/branch
      # if the master branch already exist:
      git branch -u origin/master master
    

         ( 'মূল' নামে হচ্ছে রেপো মূল প্রজেক্টের দূরবর্তী submodule থেকে। ক্লোন করা হয়েছে
         একটি git remote -vভিতরে যে submodule প্রদর্শন করব। সাধারণত, এটা হল 'উৎপত্তি')

  • আপনার প্যারেন্ট রেপোতে আপনার সাবমডিউলের নতুন স্থিতি রেকর্ড করতে ভুলবেন না:

    cd /path/to/your/parent/repo
    git add path/to/your/submodule
    git commit -m "Make submodule tracking a branch"
    
  • পরবর্তী সাবমডিউলের জন্য পরবর্তী আপডেটের --remoteবিকল্পটি ব্যবহার করতে হবে :

    # update your submodule
    # --remote will also fetch and ensure that
    # the latest commit from the branch is used
    git submodule update --remote
    
    # to avoid fetching use
    git submodule update --remote --no-fetch 
    

দ্রষ্টব্য যে গিট 2.10+ (Q3 2016) দিয়ে আপনি ' .' একটি শাখার নাম হিসাবে ব্যবহার করতে পারেন :

শাখার নামের নথিভুক্ত করা হয় submodule.<name>.branchমধ্যে .gitmodulesজন্য update --remote
এর একটি বিশেষ মান .ব্যবহৃত হয় যা উপস্থাপকের শাখার নামটি বর্তমান সংগ্রহস্থলের বর্তমান শাখার একই নাম হওয়া উচিত

কিন্তু, যেমন মন্তব্য দ্বারা LubosD

এর সাথে git checkout, যদি অনুসরণ করা শাখার নাম " ." হয়, এটি আপনার আপত্তিজনক কাজটিকে হত্যা করবে! পরিবর্তে
ব্যবহার git switchকরুন।

এর অর্থ গিট 2.23 (আগস্ট 2019) বা তারও বেশি।

" বিভ্রান্ত হয়েgit checkout " দেখুন


আপনি যদি একটি শাখাকে অনুসরণ করে আপনার সমস্ত সাবমডিউল আপডেট করতে চান:

    git submodule update --recursive --remote

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

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

শাখাটি আসলে চেক আউট হয়েছে তা নিশ্চিত করার জন্য (এবং এটি প্যারেন্ট রেপোর জন্য সাবমডিউলের প্রতিনিধিত্বকারী বিশেষ এন্ট্রির SHA1 সংশোধন করবে না ), তিনি পরামর্শ দিয়েছেন:

git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'

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

উল্লেখ্য ব্যবহার $toplevel, প্রস্তাবিত মন্তব্য দ্বারা আলেকজান্ডার Pogrebnyak
$toplevel২০১০ সালের মে মাসে git1.7.2 এ চালু হয়েছিল: f030c96 কমিট করুন

এটিতে শীর্ষ স্তরের ডিরেক্টরি (যেখানে .gitmodulesরয়েছে) এর পরম পথ রয়েছে ।

dtmlandমন্তব্যে যোগ করুন :

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

 git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –

একই কমান্ড কিন্তু পড়া সহজ:

git submodule foreach -q --recursive \
    'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
     [ "$branch" = "" ] && \
     git checkout master || git switch $branch' –

umläute রিফাইন dtmland করা একটি সরলীকৃত সংস্করণ কমান্ড মন্তব্য :

git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

একাধিক লাইন:

git submodule foreach -q --recursive \
  'git switch \
  $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

গিট 2.26 (কিউ 12020) এর আগে, সাবমোডিয়ুলগুলিতে পুনরাবৃত্তভাবে আপডেট আনতে বলা হয়েছিল এমন একটি আনয়ন অনিবার্যভাবে আউটপুটের পুনরায় উত্পাদন করে এবং ত্রুটি বার্তাগুলি স্পষ্ট করা শক্ত হয়ে যায়।

কমান্ডটি সাব-মডিউলগুলি গণনা করতে শেখানো হয়েছে যা অপারেশন শেষে ত্রুটি করেছিল

দেখুন কমিট 0222540 দ্বারা (16 জানুয়ারী 2020) এমিলি Shaffer ( nasamuffin)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে b5c71cc কমিট , 05 ফেব্রুয়ারী 2020)

fetch: সাবমডিউল আনার সময় ব্যর্থতার উপর জোর দিন

সাইন-অফ-বাই: এমিলি শেফার

অনেকগুলি সাবমডিউল থাকা অবস্থায় যখন সাবমডিউল আনতে ব্যর্থ হয় তবে একাধিক আনুষঙ্গিক ঘটনা ফিরে এলে অন্য সাবমোডিয়ুলগুলিতে ক্রিয়াকলাপের অধীনে লোন ব্যর্থ সাবমডিউল আনতে ত্রুটিটি সমাহিত করা হয় fetch-by-oid
দেরি করে একটি ব্যর্থতা ডাকুন যাতে ব্যবহারকারী সচেতন হন যে কিছু ভুল হয়েছে এবং কোথায়

কারণ fetch_finish()কেবল run_processes_parallel,মাইটেক্সিংয়ের মাধ্যমে সিঙ্ক্রোনালি বলা হয় চারপাশের প্রয়োজন হয় না submodules_with_errors


1
প্রশ্ন: আমার যদি সাবমোডুল 1 ফোল্ডার থাকে এবং মাস্টার শাখাটি ট্র্যাক করতে চান তবে ফলাফলটি কমান্ডটি কি এরকম দেখতে পাবে: git config -f .gitmodules submodule.subModule1.branch মাস্টার
BraveNewMath

1
foreachস্ক্রিপ্ট হার্ডকোডেড উপর নির্ভর করে করা হবে না <path>, যদি আপনি প্রতিস্থাপন <path>সঙ্গে $toplevel/
আলেকজান্ডার পোগ্রেবন্যাক

1
foreachস্ক্রিপ্ট চেকআউট submodules যে একটি শাখা অনুসরণ করছেন না করার ব্যর্থ হবে। যাইহোক, এই আদেশটি আপনাকে উভয়ই দেয়:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git checkout $branch'
dtmland

2
এখানে @ ডিটিএমল্যান্ডের স্ক্রিপ্টটির একটি সরল সংস্করণ রয়েছে:git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
uMLäute

1
ওহ! আসলে ফোরচ লিপি অপ্রয়োজনীয়। আমাদের সাবডার মডেল আপডেটটি - নিমজ্জন বা --rebase সুইচ: git submodule update --remote --mergeবা দ্বারা চালিত করতে হবে git submodule update --remote --rebase। এই কমান্ডগুলি দূরবর্তী শাখার ট্র্যাকিং করে।
গ্রেগটম

206

গিট 1.8.2 শাখাগুলি ট্র্যাক করার সম্ভাবনা যুক্ত করেছে।

# add submodule to track master branch
git submodule add -b branch_name URL_to_Git_repo optional_directory_rename

# update your submodule
git submodule update --remote 

আরও দেখুন গীত submodules


4
এটি কি ট্যাগগুলিতেও প্রযোজ্য?
থারস্মমনার

1
সাবমোডুলকে এভাবে যুক্ত করা কীভাবে .gitmodulesফাইলে প্রতিফলিত হয় ?
ইউজিন

1
ধন্যবাদ আমি সবেমাত্র আমাকে একটি সাব
ক্রুজ

4
আপনি একটি থেকে লক করতে পারেন ট্যাগ দিয়ে git submodule add -b tags/<sometag> <url>আপনি লাইন হিসেবে দেখতে পারেন branch = tags/<sometag>মধ্যে.gitmodules
KCD

9
@ কেসিডি গিটের কোন সংস্করণটি ট্যাগ সহ এটি করতে পারে। আমার কি কাজ করে না?
সিএমসিডিগ্রাগনকাই

58

আমি কীভাবে গিট সাবমডিউল ব্যবহার করি তার একটি উদাহরণ।

  1. একটি নতুন ভান্ডার তৈরি করুন
  2. তারপরে সাবমডিউল হিসাবে অন্য একটি সংগ্রহস্থল ক্লোন করুন
  3. তারপরে আমাদের কাছে সাব-মডিউলটি ভি 3.1.2 নামে একটি ট্যাগ ব্যবহার করে
  4. এবং তারপর আমরা প্রতিশ্রুতিবদ্ধ।

এবং এটি দেখতে কিছুটা এ জাতীয় দেখাচ্ছে:

git init 
vi README
git add README
git commit 
git submodule add git://github.com/XXXXX/xxx.yyyy.git stm32_std_lib
git status

git submodule init
git submodule update

cd stm32_std_lib/
git reset --hard V3.1.2 
cd ..
git commit -a

git submodule status 

হতে পারে এটি সহায়তা করে (যদিও আমি ট্যাগ ব্যবহার করি এবং শাখা নয়)?


4
এটি মূলত জাজোবস 7 এর মতো একই উত্তর, তবে যাইহোক ধন্যবাদ :)
ইভান

1
আপনি কি আপনার পরে কোনও পরিবর্তন করতে সক্ষম হবেন git reset --hard V3.1.2? আমি কেবলমাত্র git statusমূল ডিরেক্টরিটির সাথে একটি "প্রতিশ্রুতিবদ্ধ হওয়ার কিছুই নেই" পেয়েছি ।
নিক র‌্যাডফোর্ড

1
@ ইভান: আপনি কীভাবে এটি ব্যাখ্যা করতে পারবেন যে এটি কীভাবে ডিজেকবস 7 এর প্রতিক্রিয়া? আমি যতদূর দেখতে পাচ্ছি, তার প্রতিক্রিয়ায় এমনকি 'সাবমডিউল অ্যাড' কমান্ডও অন্তর্ভুক্ত নয়, পরিবর্তে রেপো মডিউলটির মূল গিট রেপোর কোনও লিঙ্ক ছাড়াই সরাসরি যুক্ত করা হয়। কমপক্ষে আমি যখন এই পদ্ধতির চেষ্টা করেছি তখন। গিটমডিউলগুলিতে কোনও লিঙ্ক ছিল না।
মিশেল মুলার

djacobs7 এর প্রতিক্রিয়াটিতে সাবমোডুল যোগ করা থেকে শুরু করে পুরো ব্যাখ্যাটি অন্তর্ভুক্ত করা হয়নি। তিনি ধরে নিয়েছেন আপনার কাছে এটি ইতিমধ্যে আছে।
কোডমনেকি

এটি কেবলমাত্র আপনার মূল রেপোতে ট্র্যাক করা অবজেক্ট হিসাবে পুরো সাবমোডিয়ুল সামগ্রীগুলি যুক্ত করে না?
ব্যবহারকারী 1312695

38

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

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

এটি শাখার সম্পত্তিটির জন্য সাবমডিউল কনফিগারেশন ফাইলটি পরীক্ষা করবে এবং সেট শাখাটি চেকআউট করবে।

git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'


খুশী হলাম। +1 টি। আমি আপনার আদেশ আমার উত্তরে অন্তর্ভুক্ত করেছি
ভোনসি

33

গিট সাবমোডিয়ালগুলি কিছুটা অদ্ভুত - তারা সর্বদা "বিচ্ছিন্ন মাথা" মোডে থাকে - তারা যেমন প্রত্যাশা করতে পারে তেমন কোনও শাখায় সর্বশেষ প্রতিশ্রুতিতে আপডেট হয় না।

যদিও আপনি এটি সম্পর্কে চিন্তা করেন এটি কিছুটা অর্থপূর্ণ করে তোলে। ধরা যাক আমি সাবমডিউল বারের সাহায্যে সংগ্রহস্থল foo তৈরি করি । আমি আমার পরিবর্তনগুলি ধাক্কা দিয়েছি এবং ভাণ্ডার foo থেকে কমেন্ট a7402be চেক করতে আপনাকে বলি ।

তারপরে কল্পনা করুন যে আপনি নিজের ক্লোনটি তৈরি করার আগে কেউ ভাণ্ডার বারে পরিবর্তন আনতে প্রতিশ্রুতিবদ্ধ ।

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

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


আমি মনে করি এই সময়টি আমি কিছু গিট বই পড়া শুরু করি, সুপারিশের জন্য ধন্যবাদ।
ইভান

দুঃখিত, তবে আপনি স্পষ্ট করেননি যে আপনি a7402be তে ধাক্কা খেয়েছিলেন ঠিক তেমন একটি পেলে বা সাম্প্রতিকতম বার পাবেন, যদিও আপনার ফু এর সংস্করণ। ধন্যবাদ :)
মিমি

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

@ জেরেমিক্লার্ক git clone git://github.com/git/git.gitএবং সেই বৈশিষ্ট্যটি ধাক্কা ...? = ডি
অ্যালিস্টায়ার

1
গিট সম্পর্কে সবচেয়ে বিভ্রান্তিমূলক অংশটি হ'ল উন্নয়নের দশকেরও বেশি সময় পরেও এমন একটি সরঞ্জাম যা আমাকে আমার কাজটি চালিয়ে যেতে সহায়তা করে তা এখনও এরকম খারাপ ব্যবহারকারীর অভিজ্ঞতা রয়েছে এবং পুরোপুরি আমার বাইরেও লোকেরা গিট দ্বারা আঙুল দেখানো উপভোগ করে সময়.
0xC0000022L

20

সাবমডিউলটির জন্য শাখা পরিবর্তন করতে (ধরে নিবেন আপনার কাছে ইতিমধ্যে ভান্ডারের অংশ হিসাবে সাবমডিউল রয়েছে):

  • cd সাবমোডিয়ুলসযুক্ত আপনার ভান্ডারগুলির মূলকে to
  • .gitmodulesসম্পাদনার জন্য খুলুন
  • নীচে লাইন যুক্ত করুন path = ...এবং url = ...এটি branch = your-branchপ্রতিটি সাবমডিউলের জন্য বলে ; ফাইলটি সংরক্ষণ .gitmodules
  • তারপর ডিরেক্টরি পরিবর্তন না করে $ git submodule update --remote

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


10

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

[alias]

######################
#
#Submodules aliases
#
######################


#git sm-trackbranch : places all submodules on their respective branch specified in .gitmodules
#This works if submodules are configured to track a branch, i.e if .gitmodules looks like :
#[submodule "my-submodule"]
#   path = my-submodule
#   url = git@wherever.you.like/my-submodule.git
#   branch = my-branch
sm-trackbranch = "! git submodule foreach -q --recursive 'branch=\"$(git config -f $toplevel/.gitmodules submodule.$name.branch)\"; git checkout $branch'"

#sm-pullrebase :
# - pull --rebase on the master repo
# - sm-trackbranch on every submodule
# - pull --rebase on each submodule
#
# Important note :
#- have a clean master repo and subrepos before doing this !
#- this is *not* equivalent to getting the last committed 
#  master repo + its submodules: if some submodules are tracking branches 
#  that have evolved since the last commit in the master repo,
#  they will be using those more recent commits !
#
#  (Note : On the contrary, git submodule update will stick 
#to the last committed SHA1 in the master repo)
#
sm-pullrebase = "! git pull --rebase; git submodule update; git sm-trackbranch ; git submodule foreach 'git pull --rebase' "

# git sm-diff will diff the master repo *and* its submodules
sm-diff = "! git diff && git submodule foreach 'git diff' "

#git sm-push will ask to push also submodules
sm-push = push --recurse-submodules=on-demand

#git alias : list all aliases
#useful in order to learn git syntax
alias = "!git config -l | grep alias | cut -c 7-"

3

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

সুতরাং আমরা এটিকে এটি অর্জন করেছি:

কনফিগারেশন তৈরি করুন

name: Project Name

modules:
  local/path:
    repository: https://github.com/<username>/<repo>.git
    path: repo/path
    branch: dev
  other/local/path/filename.txt:
    repository: https://github.com/<username>/<repo>.git
    hexsha: 9e3e9642cfea36f4ae216d27df100134920143b9
    path: repo/path/filename.txt

profiles:
  init:
    tasks: ['modules']

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

অন্যান্য বিকাশকারীদের কেবল চালানো দরকার

$ quack

এবং এটি উপরের কনফিগারেশনগুলি থেকে কোডটি টানছে।


2

সাবমডিউলের জন্য একটি শাখা নির্বাচনের একমাত্র প্রভাবটি হ'ল, আপনি যখনই কমান্ড লাইনে --remoteবিকল্পটি পাস করবেন git submodule update, গিট সেই নির্বাচিত দূরবর্তী শাখার সর্বশেষ প্রতিশ্রুতি (যদি ডিফল্ট আচরণটি নির্বাচিত হয়) ডিটেচড হেড মোডে পরীক্ষা করে দেখবে ।--checkout

গিট সাবমডিউলগুলির জন্য এই রিমোট ব্রাঞ্চ ট্র্যাকিং বৈশিষ্ট্যটি ব্যবহার করার সময় আপনাকে অবশ্যই বিশেষ সতর্কতা অবলম্বন করতে হবে যদি আপনি সাবমডিউলের অগভীর ক্লোনগুলির সাথে কাজ করেন। শাখা আপনি submodule সেটিংসে এই উদ্দেশ্যে চয়ন নয় যে এক সময় ক্লোন করা হবে না git submodule update --remote। আপনার কাছে পাস যদি --depthপ্যারামিটার এবং আপনি গীত নির্দেশ না যা শাখা সম্পর্কে আপনাকে ক্লোন করতে চান - এবং আসলে আপনি করতে পারেন নাgit submodule updateকমান্ড লাইন !! -, এটি স্পষ্টত প্যারামিটারটি অনুপস্থিত থাকার git-clone(1)জন্য ডকুমেন্টেশনে git clone --single-branchবর্ণিত স্পষ্টভাবে আচরণ করবে --branchএবং সুতরাং এটি কেবল প্রাথমিক শাখার ক্লোন করবে

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

মারাত্মক: একটি একক সংশোধন দরকার

সাবমোডুল পাথ 'মাই সাবমোডুল' এ বর্তমান উত্স / ননপ্রাইমারি ব্রাঞ্চ সংশোধন সন্ধান করতে অক্ষম


কীভাবে ত্রুটি ঠিক করবেন - একটি একক সংশোধন দরকার?
নিধিনস্প্রদীপ

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