দেখে মনে হচ্ছে এই আলোচনায় দুটি ভিন্ন পরিস্থিতি একত্রিত হচ্ছে:
দৃশ্যপট 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
প্যারেন্টের সংগ্রহস্থল আপডেট করতে করুন।
অবশেষে, কিছু বার্তার সাথে একটি প্রতিশ্রুতি দিয়ে বোঝানো হচ্ছে যে প্যারেন্টের সংগ্রহস্থলটি আপডেট হয়েছিল। কিছু না করা থাকলে এই প্রতিশ্রুতিটি ডিফল্টরূপে উপেক্ষা করা হবে। এটিকে উত্সাহিত করুন, এবং আপনি শেষ করেছেন।
আমার একটি জেনকিন্স চাকরিতে এটি চালিত একটি স্ক্রিপ্ট রয়েছে যা পরে একটি নির্ধারিত স্বয়ংক্রিয় মোতায়েনের জন্য শৃঙ্খলাবদ্ধ এবং এটি একটি কবজির মতো কাজ করে।
আমি আশা করি এটি কারও উপকারে আসবে।
--remote
পদ্ধতির মতো বলে মনে হচ্ছে - এখন গিটের বিকল্পের মাধ্যমে আপনার যে কার্যকারিতাটি তৈরি করতে হবে তা সম্ভবত জেসনের উত্তরে "হাত দ্বারা" পদ্ধতির পরিবর্তে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করা কার্যকর হবে?