স্ক্রিপ্ট লেখার সময় গিট শাখা ব্যবহার করা উচিত নয় । গিট একটি "নদীর গভীরতানির্ণয়" ইন্টারফেস সরবরাহ করে যা স্ক্রিপ্টিংয়ে ব্যবহারের জন্য স্পষ্টভাবে ডিজাইন করা হয়েছে (সাধারণ গিট কমান্ডের অনেকগুলি বর্তমান এবং historicalতিহাসিক বাস্তবায়ন (অ্যাড, চেকআউট, মার্জ ইত্যাদি) একই ইন্টারফেসটি ব্যবহার করে)।
আপনি যে নদীর গভীরতানির্ণয় আদেশটি চান তা হ'ল প্রতিটি-রেফের জন্য গিট :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
দ্রষ্টব্য: গিটার -রেভ-পার্সের নির্দিষ্টকরণ সংশোধন বিভাগে রেফ নাম অনুসন্ধানের পথে একাধিক জায়গার সাথে মিলে যাওয়ার remotes/
কারণ হিসাবে অন্যান্য রেফ না থাকলে আপনার রিমোট রেফের উপসর্গের প্রয়োজন হবে না origin/master
see (1) )। আপনি explictly অস্পষ্টতা এড়ানোর চেষ্টা হয়, তাহলে পূর্ণ; ref name সঙ্গে যান: refs/remotes/origin/master
।
আপনি এভাবে আউটপুট পাবেন:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
আপনি এই আউটপুট sh এ পাইপ করতে পারেন ।
আপনি শেল কোড তৈরী ধারণা পছন্দ না হয়, আপনি বলিষ্ঠতার একটি বিট আপ দিতে পারে * এবং এই একটি করুন:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* শেলের শব্দ বিভাজন থেকে রেফের নামগুলি নিরাপদ হওয়া উচিত ( গিট-চেক-রেফ-ফর্ম্যাট (1) )। ব্যক্তিগতভাবে আমি পূর্ববর্তী সংস্করণ (উত্পন্ন শেল কোড) দিয়ে থাকব; আমি আরও আত্মবিশ্বাসী যে এটির সাথে অনুপযুক্ত কিছুই ঘটতে পারে না।
যেহেতু আপনি বাশ নির্দিষ্ট করেছেন এবং এটি অ্যারেগুলিকে সমর্থন করে তাই আপনি সুরক্ষা বজায় রাখতে পারেন এবং তবুও আপনার লুপের সাহস তৈরি করতে এড়াতে পারেন:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
আপনি $@
যদি অ্যারে সমর্থন করে এমন শেল ব্যবহার না করে ( উপাদান set --
শুরু করতে এবং set -- "$@" %(refname)
উপাদান যোগ করতে) ব্যবহার করেন তবে এর সাথে আপনিও তেমন কিছু করতে পারেন ।