আমি বহু বছর ধরে আদমের উত্তর ব্যবহার করেছি। এটি বলেছিল যে কিছু কিছু ক্ষেত্রে এটি প্রত্যাশা মতো আচরণ করা হয়নি:
- শাখা যে অন্তর্ভুক্ত শব্দ "মাস্টার" উপেক্ষা করা হয়েছে, যেমন "notmaster" বা "উদ্ধত", বরং শুধুমাত্র মাস্টার শাখা চেয়ে
- শাখা যে অন্তর্ভুক্ত"দেব" শব্দটি করে উপেক্ষা করা হয়েছিল, যেমন "দেব-পরীক্ষা", বরং কেবলমাত্র দেব শাখা
- বর্তমানের শিরোনাম থেকে পাওয়া যায় এমন শাখাগুলি মুছে ফেলা হচ্ছে শাখার হচ্ছে (এটি অবশ্যই প্রয়োজনীয় নয়)
- বিচ্ছিন্ন হেড অবস্থায়, বর্তমান কমিট থেকে পৌঁছনীয় প্রতিটি শাখা মুছে ফেলা
1 এবং 2 ঠিক রেগেক্সে পরিবর্তনের সাথে সম্বোধনের পক্ষে সোজা ছিল। 3 আপনি যা চান তার প্রসঙ্গে (যেমন কেবলমাত্র সেই শাখাগুলি মুছুন যা মাস্টারে বা আপনার বর্তমান শাখার বিপরীতে বিভক্ত হয়নি)। 4 টি বিপর্যয়কর হওয়ার সম্ভাবনা রয়েছে (যদিও এর সাথে পুনরুদ্ধারযোগ্য git reflog
), যদি আপনি অজান্তেই এটিকে পৃথক হেড অবস্থায় চালিয়ে যান।
অবশেষে, আমি এটি সবার কাছে চেয়েছিলাম যে ওয়ান লাইনারে থাকতে হবে যার জন্য আলাদা (বাশ | রুবি | পাইথন) স্ক্রিপ্টের দরকার নেই।
টি এল; ডিআর
একটি গিট ওরফে "সুইপ" তৈরি করুন যা একটি -f
flag চ্ছিক পতাকা গ্রহণ করে :
git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'
এবং এর সাথে অনুরোধ করুন:
git sweep
বা:
git sweep -f
দীর্ঘ, বিস্তারিত উত্তর
কিছু শাখাগুলির সাথে গিট রেপো তৈরি করা আমার পক্ষে সবচেয়ে সহজ ছিল এবং সঠিক আচরণ পরীক্ষা করার জন্য প্রতিশ্রুতিবদ্ধ:
একক প্রতিশ্রুতি দিয়ে একটি নতুন গিট রেপো তৈরি করুন
mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"
কিছু নতুন শাখা তৈরি করুন
git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
bar
develop
foo
* master
masterful
notmaster
পছন্দসই আচরণ: বাদে সমস্ত মার্জ করা শাখাগুলি নির্বাচন করুন: মাস্টার, বিকাশ বা বর্তমান
মূল রেজেক্সটি "মাস্টারফুল" এবং "নোটমাস্টার" শাখাগুলি মিস করে:
git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
bar
আপডেট হওয়া রেজেক্সের সাথে (যা এখন "দেব" এর পরিবর্তে "বিকাশ" বাদ দেয়):
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
শাখা ফুতে স্যুইচ করুন, একটি নতুন অঙ্গীকারবদ্ধ করুন, তারপরে foo এর উপর ভিত্তি করে একটি নতুন শাখা, ফুবার চেকআউট করুন:
echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"
আমার বর্তমান শাখাটি ফুবার, এবং আমি যে শাখাগুলি মুছতে চাইছি তার তালিকা করতে যদি আমি উপরের কমান্ডটি পুনরায় চালিত করি, তবে শাখা "ফু" মাস্টার হিসাবে একীভূত না হওয়া সত্ত্বেও অন্তর্ভুক্ত থাকবে:
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
foo
masterful
notmaster
তবে, আমি যদি মাস্টারে একই কমান্ডটি চালাই তবে শাখা "foo" অন্তর্ভুক্ত নয়:
git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
এবং এটি কেবলমাত্র কারণ git branch --merged
অন্যথায় সুনির্দিষ্ট না থাকলে বর্তমান শাখার প্রধানের ডিফল্ট। কমপক্ষে আমার কর্মপ্রবাহের জন্য, আমি স্থানীয় শাখাগুলি মাস্টারে একীভূত না করা চাই না, তাই আমি নিম্নলিখিত রূপটি পছন্দ করি:
git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
পৃথকভাবে হেডের অবস্থা
ডিফল্ট আচরণের উপর নির্ভর করা git branch --merged
পৃথক হেড রাজ্যে আরও তাত্পর্যপূর্ণ পরিণতি ঘটায়:
git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
foo
foobar
masterful
notmaster
এটি আমার কেবল যে শাখাটি ছিল, মুছে ফেলা হবে "ফুব" পাশাপাশি "ফু", যা সম্ভবত অবশ্যই পছন্দসই ফলাফল নয়। আমাদের সংশোধিত আদেশ সহ, যদিও:
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
আসল মোছা সহ এক লাইন
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d
সমস্ত একটি গিট ওরফে "সুইপ" এ আবৃত:
git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'
উপনাম একটি alচ্ছিক -f
পতাকা গ্রহণ করে । ডিফল্ট আচরণটি কেবল সেই শাখাগুলি মুছে ফেলা হয় যা মাস্টারে মার্জ করা হয়েছিল, তবে -f
পতাকাটি বর্তমান শাখায় মার্জ করা শাখাগুলি মুছবে।
git sweep
Deleted branch bar (was 9a56952).
Deleted branch masterful (was 9a56952).
Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).
git branch -D
কোনও শাখাকে মুছে ফেলা হয়েছে কিনা তা মুছে ফেলা হয়েছে।