কীভাবে স্থানীয় ট্র্যাকিং শাখাগুলি ছাঁটাই করা যায় যা দূরবর্তী অঞ্চলে নেই


767

এর সাহায্যে git remote prune originআমি স্থানীয় শাখাগুলি সরিয়ে ফেলতে পারি যা আর রিমোটে নেই।

তবে আমি সেই দূরবর্তী শাখাগুলি থেকে তৈরি স্থানীয় শাখাগুলিও সরাতে চাই (তারা যদি না নিমজ্জিত হয় তবে একটি চেকটি দুর্দান্ত হবে)।

কিভাবে আমি এটি করতে পারব?



1
ওয়ান-লাইনার, ক্রস প্ল্যাটফর্ম, আপনার কীবোর্ডে বিড়ালটি ঘুমানোর মতো দেখাচ্ছে না: npx git-removed-branches(শুকনো রান) বা npx git-removed-branches --prune( বাস্তবের জন্য)। আপনার ইতিমধ্যে নোড.জেগুলি ইনস্টল করা দরকার। বিস্তারিত জানার জন্য নীচে উত্তর দেখুন ।
ক্রিশ্চিয়ান ডায়াকোনস্কু

উত্তর:


888

ছাঁটাইয়ের পরে, আপনি এর সাথে প্রত্যন্ত শাখাগুলির তালিকা পেতে পারেন git branch -r। তাদের দূরবর্তী ট্র্যাকিং শাখার সাথে শাখাগুলির তালিকা পুনরুদ্ধার করা যেতে পারে git branch -vv। সুতরাং এই দুটি তালিকা ব্যবহার করে আপনি রিমোটের তালিকায় নেই এমন দূরবর্তী ট্র্যাকিং শাখাগুলি খুঁজে পেতে পারেন।

এই লাইনটি কৌশলটি করা উচিত (প্রয়োজন bashবা zshস্ট্যান্ডার্ড বোর্ন শেলটির সাথে কাজ করবে না):

git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

এই স্ট্রিংটি দূরবর্তী শাখাগুলির তালিকা পায় এবং egrepএটি স্ট্যান্ডার্ড ইনপুট দিয়ে দেয়। এবং যে শাখাগুলিতে দূরবর্তী ট্র্যাকিং শাখা রয়েছে ( git branch -vvতাদের জন্য ব্যবহার এবং ফিল্টারিং origin) এর ফিল্টারগুলি তারপরে সেই আউটপুটটির প্রথম কলামটি পাবে যা শাখার নাম হবে। অবশেষে সমস্ত শাখার নাম মুছে ফেলুন শাখা কমান্ডের সাথে প্রেরণ করা।

যেহেতু এটি -dবিকল্পটি ব্যবহার করছে , এটি এই শাখাগুলি মুছে ফেলবে না যে আপনি যে কমান্ডটি চালাচ্ছেন সেই শাখায় যে শাখায় মার্জ করা হয়নি into

এছাড়াও মনে রাখবেন যে আপনাকে git fetch --prune প্রথমে চালানো দরকার , অন্যথায় git branch -rএখনও দূরবর্তী শাখাগুলি দেখতে পাবে।


12
এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে। একরকম, git fetch -pসবসময় যথেষ্ট হয় না?
স্টিফান হেন্ডরিক্স

16
দুর্ভাগ্যক্রমে উইন্ডোজে গিট বাশে এটি কাজ করে না। sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required কোন ধারনা?
লুডার

37
এটিকে একটি নাম হিসাবে যুক্ত করতে:alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
ব্রায়ান্ট 1410

125
ভবিষ্যতের গিট রিলিজের জন্য এমন কোনও প্রস্তাবিত আদেশ রয়েছে যা এটি করবে? এই কমান্ডটি দেখে মনে হচ্ছে আমার বিড়ালটি আমার ল্যাপটপে রয়েছে
ব্রোন ডেভিস

5
ব্যবহার git branch -Dকমান্ডের শেষে আমাদের জন্য ভালো কাজ, যেমন আমরা একত্রীকরণ উপর স্কোয়াশ করে থাকে, যা আমাদের পায় The branch x is not fully mergedযখন দিয়ে চলছে ত্রুটি -d
ম্যাটিউস গন্ডিম

429

আপনি যদি ইতিমধ্যে মাস্টারে মার্জ হওয়া সমস্ত স্থানীয় শাখা মুছে ফেলতে চান তবে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

আরও তথ্য


4
নিখুঁত কাজ করেছেন, আমার মনে হয়! এই উত্তরটি যদি স্বীকৃত উত্তরের চেয়ে আলাদাভাবে কিছু করে তবে কি কেউ ব্যাখ্যা করতে পারবেন?
অ্যান্ড্রু

11
গৌণ উন্নতি: ব্যবহার করুন xargs -r git branch -dযাতে মুছার জন্য কোনও শাখা না থাকলে কিছুই চালিত হয় না। নোট করুন যে -rপতাকাটি সর্বত্র পাওয়া যাবে না
জ্যাকব ওয়াং

8
যেহেতু গিট রঙের কারণে গ্রেপ মেলাতে পারে না:git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
মাইক ডি

5
@ নিকরেস আপনি যেমন খুব সুন্দরভাবে জিজ্ঞাসা করেছেন দেখতে পাচ্ছে, git branch --merged masterসেই শাখাগুলিকে তালিকাবদ্ধ করে যা মাস্টারে বিভক্ত হয়ে গেছে, তারপরে মাঝের গ্রেপ অংশটি মাস্টারকে বাদ দেয় (আমরা মাস্টারকে মুছতে চাই না!) এবং শেষ xargs অংশটি git branch -dপ্রতিটিটির উপর এক্সিকিউট করে (শাখা মুছুন) ফলাফলগুলো. অথবা আপনি কেবল উত্তরে প্রদত্ত আরও তথ্যের লিঙ্কটি পড়তে পারেন;)
জ্যাকোকনার

14
লিখেছেন: git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d। গিটার ভি 2.10.1 থেকে আউটপুট "* মাস্টার" প্রদর্শন করবে যখন মাস্টার চেক আউট হবে। আমি নক্ষত্রের সাথে বা ছাড়াই উভয়কেই মাস্টার থেকে মুক্তি পেয়েছি।
এস্তেবান

162

উপস্থাপিত তথ্যের git help fetchমধ্যে এই ছোট্ট আইটেমটি রয়েছে:

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

সুতরাং, সম্ভবত, git fetch -pআপনি কি খুঁজছেন?

সম্পাদনা: ঠিক আছে, 3 বছর পরে এখনও এই উত্তর নিয়ে যারা বিতর্ক করছেন তাদের জন্য, কেন আমি এই উত্তরটি উপস্থাপন করেছি সে সম্পর্কে এখানে আরও কিছু তথ্য ...

প্রথমত, ওপি বলেছে যে তারা "সেই দূরবর্তী শাখাগুলি [যে দূরবর্তী অঞ্চলে আর নেই) থেকে যে স্থানীয় শাখা তৈরি হয়েছিল সেগুলিও মুছে ফেলতে চায়"। এটি অস্পষ্টভাবে সম্ভব নয় git। এখানে একটি উদাহরণ।

ধরা যাক আমার একটি কেন্দ্রীয় সার্ভারে একটি রেপো আছে এবং এর দুটি শাখা রয়েছে, নামক Aএবং B। যদি আমি সেই রেপোটিকে আমার স্থানীয় সিস্টেমে ক্লোন করি তবে আমার ক্লোনটিতে স্থানীয় রেফ থাকবে (এখনও প্রকৃত শাখা নয়) কল origin/Aএবং origin/B। এখন বলা যাক আমি নিম্নলিখিতগুলি করি:

git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>

এখানে প্রাসঙ্গিক তথ্যগুলি হ'ল আমি কোনও কারণে আমার স্থানীয় রেপোতে একটি শাখা তৈরি করা বেছে নিয়েছিলাম যার উত্সের চেয়ে আলাদা নাম রয়েছে এবং আমার একটি স্থানীয় শাখাও রয়েছে যা মূল তলবিক রেপোতে (এখনও) বিদ্যমান নেই।

এখন বলা যাক যে আমি দূরবর্তী রেপোতে উভয় শাখা Aএবং Bশাখা সরিয়ে নিয়েছি এবং আমার স্থানীয় রেপো ( git fetchকিছু রূপের) আপডেট করি যা আমার স্থানীয় রেফগুলি origin/Aএবং origin/Bঅদৃশ্য হয়ে যায়। এখন, আমার স্থানীয় রেপো তিনটি শাখা এখনো রয়েছে A, Zএবং C। এগুলির কোনওটিরই দূরবর্তী রেপোতে সংশ্লিষ্ট শাখা নেই। তাদের মধ্যে দুটি "... দূরবর্তী শাখা থেকে তৈরি করা হয়েছিল", তবে আমি যদি জানি যে Bউত্সর নামে ডাকা একটি শাখা ব্যবহৃত হত তবে আমার জানার কোনও উপায় নেই যে Zএটি তৈরি করা হয়েছিলB, কারণ এটি প্রক্রিয়াটির নামকরণ করা হয়েছিল, সম্ভবত কোনও ভাল কারণে। সুতরাং, প্রকৃতপক্ষে, কোনও বাহ্যিক প্রক্রিয়া রেকর্ডিং শাখার উত্স মেটাডেটা বা ইতিহাসের জানা মানুষ ছাড়া, তিনটি শাখার মধ্যে কোনটি অপসারণের জন্য লক্ষ্য করে চলেছে তা জানা অসম্ভব। কিছু বাহ্যিক তথ্য gitনা থাকলে যা স্বয়ংক্রিয়ভাবে আপনার জন্য রক্ষা না করে, আপনি git fetch -pযেমন পেতে পারেন ততই কাছাকাছি, এবং ওপি যা জিজ্ঞাসা করেছিল তা আক্ষরিক অর্থে চেষ্টা করার জন্য যে কোনও স্বয়ংক্রিয় পদ্ধতিতে অনেকগুলি শাখা মুছে ফেলার ঝুঁকি রয়েছে, নাহলে ওপি অন্যথায় কিছু হারিয়ে ফেলবে some মুছে ফেলতে চান

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


107
এটি স্থানীয় শাখাগুলি মুছে ফেলবে না, কেবল শাখাগুলির কাছে দূরবর্তী পয়েন্টারগুলি
জাপ

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

15
জাপ নোট হিসাবে আপনার প্রশ্নটি আরও মনোযোগ সহকারে পড়া উচিত। এই উত্তরের জন্য ভোট দেওয়া লোকেরাও প্রশ্নটি আসলে কী তা পড়তে হবে।
সেরেন বোইসেন

4
হ্যাঁ, এটি আসলে আমি যা করতে চেয়েছিলাম! @ সেরেনবয়েসেন আমি আশা করি গত দুই বছরে আপনার মতামতটি পুনর্বিবেচনার জন্য আপনার কাছে সময় এসেছে ... যদি এসওতে পোস্ট করা সামগ্রীটি সবসময় কেবলমাত্র বিভ্রান্তিকর ওপিদের জিজ্ঞাসার সাথে সম্পর্কিত হয় তবে আমরা প্রচুর তথ্য সরিয়ে ফেলব। অফিসিয়াল নির্দেশিকা ব্যতীত লোকেরা কীভাবে এই সাইটটি ব্যবহার করতে পারে তা নির্দেশ দেওয়ার জন্য অনুমান করবেন না এবং তারা স্পষ্টতই orthogonal এখনও দরকারী উত্তরগুলি রোধ করে না।
ফলিক্স গাগনন-গ্রেনিয়ার

6
@ ফালিক্সগ্যাগন-গ্রেনিয়ার এই উত্তরটি নিয়ে আমার সমস্যাটি এখানে: ১) প্রশ্নটি স্ফটিক স্পষ্ট, ওপি স্পষ্টভাবে বিভ্রান্ত নয়। 2) এই উত্তরটি প্রশ্নের উত্তর দেয় না তা উল্লেখ করে না! 3) প্রশ্নটি ইতিমধ্যে দূরবর্তী ট্র্যাকিং শাখাগুলি ছাঁটাই করার একটি উপায় জানিয়েছে যা এখন আর নেই, সুতরাং এটি শূন্য মান যুক্ত করে।
সেরেন বোইসেন

117

এটি সেই স্থানীয় শাখাগুলি মুছে ফেলবে যার জন্য দূরবর্তী ট্র্যাকিং শাখা ছাঁটাই করা হয়েছে। (আপনি masterশাখায় রয়েছেন তা নিশ্চিত করুন !)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

বিবরণ:

  • git branch -vv স্থানীয় শাখাগুলির জন্য "চলে গেছে" প্রদর্শন করে যে রিমোটটি ছাঁটাই করা হয়েছে।

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dএটি একীভূত হয়েছে কিনা তা পরীক্ষা করবে ( -Dএটিকে নির্বিশেষে মুছে ফেলবে)

    error: The branch 'mybranch' is not fully merged.
    

15
আপনি কমান্ডটি আরও ছোট করে তুলতে পারবেনgit branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
chiborg

4
কেবল এটি নির্দেশ করে যে এটি করার আগে আপনার মাস্টার হওয়া উচিত, কারণ git branch -dশাখাগুলির সাথে তুলনা করা HEAD
স্টিভ বেনেট

অসাধারণ! আমি এই জন্য সন্ধান এবং সন্ধান। আমি আশা করি আমি নিজের উত্তরটি নিজেরাই খুঁজে বের করার আগে আপনার উত্তরটি দেখেছি। এটি আমাকে কয়েক মিনিট বাঁচাতে পারত। আমার অন্য উত্তরটি এখানে: স্ট্যাকওভারফ্লো.com
কার্ল উইলবার

1
আমি একই ধরণের গিট ওরফে দিয়ে শেষ করেছিলাম, যেহেতু prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
অভ্যাস

3
ওহ দোস্ত ... উইসবুকি আপনি লোকদের মাস্টার হতে হবে তা জানাতে আপনার উত্তর আপডেট করার প্রয়োজন। সবেমাত্র এটি একটি ভিন্ন শাখা থেকে করেছে। @ তথ্যভিত্তিক মন্তব্যের জন্য স্টিভবেনেট 2 ধন্যবাদ
গ্রেডফক্স

53

আনার সময় মুছে ফেলা দূরবর্তী শাখাগুলির রেফারেন্সগুলি স্বয়ংক্রিয়ভাবে সরানোর জন্য কেউ গিটকে কনফিগার করতে পারে:

git config --global fetch.prune true

কল করার পরে git fetchবা git pullতারপরে, মুছে ফেলা দূরবর্তী শাখাগুলির উল্লেখ স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে।


5
এটি স্থানীয় শাখাগুলি সরিয়ে দেয় না, কেবল তাদের জন্য রেফারেন্স, তাই না?
ক্লিন্ট ইস্টউড

@ ক্লিন্টইস্টউড এটি কেবল প্রত্যন্ত শাখাগুলির উল্লেখ মুছে দেয়। ব্যবহার করে আপনি দূরবর্তী শাখাগুলির রেফারেন্স তালিকাভুক্ত করতে পারেন git branch -r
ওয়েডসফট

52

একটি ঝরঝরে এনপিএম প্যাকেজ রয়েছে যা এটি আপনার জন্য করে (এবং এটি ক্রস প্ল্যাটফর্মের কাজ করা উচিত)।

এটি দিয়ে এটি ইনস্টল করুন: npm install -g git-removed-branches

এবং তারপরে git removed-branchesআপনাকে সমস্ত বাসি স্থানীয় শাখা দেখাবে এবং git removed-branches --pruneসেগুলি প্রকৃতপক্ষে মুছে ফেলতে হবে।

আরও তথ্য এখানে।


1
এটিতে আরও বেশি উপায়ে নেওয়া উচিত। প্ল্যাটফর্ম নির্বিশেষে জীবনকে সহজ করার জন্য ধন্যবাদ।
এনক্রিপশন

খুব সামান্য এক্সটেনশন। উইন্ডোজ ১০-এ ইনস্টল এবং জরিমানা কাজ করেছে। ছোট্ট দ্রষ্টব্য: এটি অ-মার্জড শাখাগুলিকে ছাঁটাই-সক্ষম হিসাবে বিবেচনা করে (প্রুনি চালানোর সময় ত্রুটি, যদিও শাখা-ডি বলা হয়েছিল) .. সেগুলি অবশ্য প্রাথমিক হিসাবে বর্ণিত নয় তালিকা দেখানো হয়েছে।
ব্যবহারকারী 2864740

1
এটি আমার প্রিয় উত্তর। npx git-removed-branchesস্বপ্নের মতো কাজ করে।
ড্রাজিসিল

হ্যাঁ! এটি আরও upvotes করা উচিত!
ক্লাইমের নবজাতকের

গিটের দৃষ্টিকোণ থেকে সরঞ্জামটি কী করছে তার একটি সংক্ষিপ্ত বিবরণ দেওয়া দরকারী হবে।
ryanwebjackson

41

উইন্ডোজ সমাধান

মাইক্রোসফ্ট উইন্ডোজ পাওয়ারশেলের জন্য:

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

Explaination

git checkout master মাস্টার শাখায় স্যুইচ করে

git remote update origin --prune প্রত্যন্ত শাখা prunes

git branch -vvসমস্ত শাখার ভার্জোজ আউটপুট পায় ( গিট রেফারেন্স )

Select-String -Pattern ": gone]" সেগুলি কেবলমাত্র রেকর্ডগুলি পায় যেখানে সেগুলি দূরবর্তী থেকে সরানো হয়েছে।

% { $_.toString().Split(" ")[0]} শাখার নাম পান

% {git branch -d $_} শাখাটি মুছে দেয়


চমৎকার উদাহরণ। বিকল্পভাবে ব্যবহার করুন git remote prune origin, সিলেক্ট-স্ট্রিং গিটের সর্বশেষতম সংস্করণের সাথে মিলছে বলে মনে হয় না। ব্যবহার বিবেচনা করুনConvertFrom-String -TemplateContent
বার্নি হোয়াইট

3
দেখে মনে হচ্ছে গিটের সর্বশেষতম সংস্করণটি কিছু পিছনে স্থান যুক্ত করে, তাই স্প্লিট শাখার নাম পাওয়ার জন্য কাজ করে না। টু স্ট্রিং ()। ট্রিম ()। বিভক্ত ("") এবং এটি হবে
ক্রিস হেইন

এখানে আমার:git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
ওমজিগ

@ ওমজিগ এটি কীভাবে আলাদা করে? আপনি একটি ব্যাখ্যা দিতে পারেন>
chris31389

@ chris31389, আমি মাস্টার থেকে নিখোঁজ থাকা সমস্ত কিছু পাওয়ার জন্য আমার সেখানে টান আছে এবং আমি শাখাটি পরিবর্তন করে - নিমজ্জিত করেছি এবং মাস্টার হিসাবে না, আমি নিশ্চিত করতে চাই যে আমি কেবল ডুবে থাকা শাখাগুলি মুছব। এটি কেবল আমাকে আরও ভাল বোধ করে;)
ওমজিগ

27

এটি স্থানীয় শাখাগুলির তালিকা তৈরি করবে যাদের দূরবর্তী থেকে ট্র্যাকিং শাখা মুছে ফেলা হয়েছে

$ git remote prune origin --dry-run

আপনি স্থানীয় থেকে এই স্থানীয় শাখাগুলি ডি-রেফারেন্স করতে চান যা অন ট্র্যাকড

$ git remote prune origin

19
এটি প্রশ্নের উত্তর দেয় না, এটি ওপি ইতিমধ্যে জানত।
কেন উইলিয়ামস

2
আমিও সম্মত, তবে আপনি যখন অনুসন্ধান করবেন "স্থানীয় ট্র্যাকিং শাখাগুলি ছাঁটাই করা যায় যা দূরবর্তী অঞ্চলে আর নেই", এই শীর্ষ লিঙ্কটি এবং এই উত্তরটি শিরোনামের সাথে মেলে (যদি কোনও ব্যক্তি পুরো বিবরণটি প্রশ্নে পড়ে থাকে তবে), যে ভোট
027

এটি স্থানীয় শাখাগুলি সরিয়ে দেয় না। এটি চালানোর পরেও সেখানে রয়েছে
জিন

@ এক্স কমান্ডটি চালানোর চেষ্টা করুন - ড্রি-রান আর্গুমেন্ট ব্যতীত এটি কমান্ডটি বাস্তবে কার্যকর করবে না, তবে এটি কী পরিবর্তিত হবে তা আপনাকে দেখায়।
23:18

18

@ ট্যাজ্যাকস নোট হিসাবে ... একটি এনপিএম প্যাকেজ রয়েছে যা এটির জন্য কার্যকর। শুধু কর:

npx git-removed-branches --prune

(আমি মন্তব্য করব তবে যথেষ্ট খ্যাতি নেই)


1
টকটকে। কোন ঝামেলা নেই। খুশির এই পুরো উত্তর ছিল!
ড্যান রেসন

1
এটি শীর্ষে থাকা উচিত। উইন্ডোজেও কাজ করে।
টমটাস্টিকো

14

যদি উইন্ডোজ এবং পাওয়ারশেল ব্যবহার করে থাকেন তবে বর্তমানে শাখায় একত্রীকরণ করা সমস্ত স্থানীয় শাখা মুছে ফেলার জন্য আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

ব্যাখ্যা

  • বর্তমান শাখা এবং এতে যুক্ত হওয়া শাখাগুলি তালিকাবদ্ধ করে
  • বর্তমান শাখাটি ফিল্টার করে
  • gitপ্রতিটি অবশিষ্ট শাখার নামের জন্য আউটপুট থেকে যেকোনো নেতৃস্থানীয় বা পিছনের স্থানগুলি পরিষ্কার করে
  • মার্জ হওয়া স্থানীয় শাখাগুলি মুছে ফেলে

এটি git branch --mergedকেবল আপনি যা আশা করেন তা সরিয়ে ফেলবে তা নিশ্চিত করার জন্য এটি প্রথমে নিজে চালানো উপযুক্ত ।

( Http://railsware.com/blog/2014/08/11/git- हाउसকিপিং- টিউটোরিয়াল- ক্ল্যান- আপডেটেড-ব্র্যাঙ্কস-ইন- লোকাল- এবং- রেমোট- রিপোসিটিরিজ / থেকে স্বয়ংক্রিয়ভাবে পোর্টড / অটোমেটেড )


10

এমনকি আরও ছোট এবং নিরাপদ ওয়ান-লাইনার:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

এটি চালানোর আগে যে শাখায় এখনও মার্জ করা হয়নি তা চেকআউট করতে ভুলবেন না। কারণ আপনি বর্তমানে যে শাখাটি চেক ইন করেছেন তা আপনি মুছতে পারবেন না।


3
এটিও কি আপনার 'গুরুকে' সরিয়ে দেবে?
dcsan

2
আপনি যদি বর্তমানে মাস্টারটিতে চেক করেছেন তবে না, অন্যথায় হ্যাঁ
ফেলিকজেড

1
মাস্টার এড়িয়ে যেতে আপনি কেবল git branch -d $(git branch --merged | cut -c 3- | grep -v master)
গ্রেপ

এটি অনিরাপদ এবং ভবিষ্যতে কেউ অজান্তেই তাদের মাস্টার শাখাটি মুছে ফেলবে
জেসনসেমিনিরা

1
@ জেসনসেমিনারা # ডিসিএসএন আমি স্নিপেট আপডেট করেছি, সুতরাং এটি মাস্টার শাখাটি এড়িয়ে চলে। # মোজিল্লাইভস ধন্যবাদ
ফেলিকজেড

9

আমি এমন কিছু চাইছিলাম যা দূরবর্তী শাখাগুলি ট্র্যাক করছে এমন সমস্ত স্থানীয় শাখা মুছে ফেলবে origin, যেখানে দূরবর্তী শাখাটি মুছে ফেলা হয়েছে ( gone)। আমি কোনও দূরবর্তী শাখা (যেমন: আমার স্থানীয় দেব শাখা) ট্র্যাক করার জন্য কখনও স্থাপন করা হয়নি এমন স্থানীয় শাখাগুলি মুছতে চাইনি। এছাড়াও, আমি gitকাস্টম স্ক্রিপ্টগুলি লেখার পরিবর্তে একটি সাধারণ একটি লাইনার চাই যা কেবলমাত্র ব্যবহৃত সিআইএল সরঞ্জাম ব্যবহার করে । আমি কিছুটা ব্যবহার করে grepএবং awkএই সহজ কমান্ডটি তৈরি করে শেষ করেছি , তারপরে এটি আমার একটি উপন্যাস হিসাবে যুক্ত হয়েছে ~/.gitconfig

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

git config --global ...সহজেই এটি যুক্ত করার জন্য এখানে একটি আদেশ রয়েছে git prune-branches:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

দ্রষ্টব্য: -Dপতাকাটি ব্যবহার git branchকরা খুব বিপজ্জনক হতে পারে। সুতরাং, উপরের কনফিগার কমান্ডে আমি -dবিকল্পটি git branchপরিবর্তে ব্যবহার করি -D; আমি -Dআমার আসল কনফিগারেশনে ব্যবহার করি । আমি ব্যবহার করি -Dকারণ আমি গিটকে নিমজ্জিত শাখাগুলির বিষয়ে অভিযোগ শুনতে চাই না, আমি কেবল তাদের যেতে চাই। আপনি এই কার্যকারিতাটিও চাইবেন। যদি তা হয় তবে কনফিগার কমান্ডের শেষে কেবল -Dপরিবর্তে ব্যবহার করুন -d


8

দূরবর্তী শাখা অপসারণ করতে:

$git remote prune origin

ইতিমধ্যে মার্জ হওয়া স্থানীয় শাখাগুলি সরাতে:

$git branch -D $(git branch --merged)

আমার জন্য কাজ কর. ধন্যবাদ।
অ্যান্ড্রয়েডআরটাইম এক্সেপশন

2
(গিট শাখা - নিমজ্জিত) আমার জন্য 'মাস্টার'ও ফেরত দেয়। এবং অন্যান্য শাখাগুলি যা রিমোটে মোছা হয়নি।
টম জি

7
এটি আমার মাস্টার শাখাটি মোছা হয়েছে।
গ্রেগ

5

নিরাপদ ওয়ান-লাইনার বলে মনে হচ্ছে না, অনেকগুলি প্রান্তের কেস রয়েছে (যেমন একটি শাখা যার নামের অংশ হিসাবে "মাস্টার" রয়েছে)। নিরাপদ এই পদক্ষেপগুলি:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. ফাইলটি দেখুন এবং আপনি যে শাখাগুলি রাখতে চান তার জন্য লাইনগুলি সরান (যেমন মাস্টার শাখা!); আপনার কোনও লাইনের সামগ্রী সম্পাদনা করার দরকার নেই need
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d

5

উপরের উত্তরের ভিত্তিতে আমি এই সংক্ষিপ্ততর একটি লাইনার ব্যবহার করছি:

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

এছাড়াও, যদি আপনি ইতিমধ্যে ছাঁটাই করে থাকেন এবং স্থানীয় ঝোলা শাখা থাকে তবে এটি এগুলি পরিষ্কার করে দেবে:

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d

1
যদি আপনার শাখা নামগুলি আছে কাজ করে না /তাদের মধ্যে
theicfire

4

কীভাবে এটি একবারে করবেন তা নিশ্চিত নন, তবে গিট git branch -d <branchname>সম্পূর্ণরূপে একীভূত হয়ে গেলে স্থানীয় একটি শাখা মুছে ফেলবে। ছোট হাতের নোট

git branch -D <branchname> (মূলধন নোটটি নোট করুন) কোনও স্থানীয় শাখাটিকে মার্জ করা স্থিতি নির্বিশেষে মুছে ফেলবে।


উইন্ডোজে, অন্য উত্তরগুলি আমার পক্ষে কার্যকর হয়নি। এই উত্তরটি সাধারণ-ডি সুইচ দিয়ে ব্যবহার করা হয়েছে (যদিও শাখাটি ইতিমধ্যে "মুছে ফেলা হয়েছে")।

আমরা কি সব শাখার জন্য একবারে এটি করতে পারি?
তেওমান শিপাহী

3

আপনি এই আদেশটি ব্যবহার করতে পারেন:

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

গিট ক্লিন: কমান্ডের ব্রেক ডাউন সহ ইতিমধ্যে মার্জ হওয়া শাখাগুলি মুছুন


আপনার কোনও শাখা ফিল্টার করার প্রয়োজন নেই (প্রাক্তন মাস্টার)। যদি এটি "একীভূত" হয় তবে এর অর্থ হ'ল এটি আপনার স্থানীয় অনুলিপিটি সরিয়ে ফেলবে, তবে "গিট চেকআউট ডেভ" ইতিমধ্যে উপস্থিত না থাকলে দূরবর্তী থেকে একটি স্থানীয় শাখা তৈরি করবে
csga5000

স্থানীয় শাখার তালিকাটি এখনও একত্রীকরণ করা সত্ত্বেও রয়েছে। এই কমান্ডটি হ'ল এই শাখাগুলি দূরবর্তী থেকে মুছে ফেলা হবে remove
সেন্ডন 1982

শুরুতে তারকাচিহ্নটির অর্থ বর্তমান শাখা, আপনি যখন বিভিন্ন শাখায় সেই কমান্ডটি চালান তখন ভাল কাজ করে না
ওজাইচেক

2

উপরের উত্তরের ভিত্তিতে আমি এই এক লাইন সমাধান নিয়ে এসেছি:

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

2

@ উইশবাকির উত্তরে একটি বৈকল্পিক ব্যবহার করে, আমি আমার ~/.gitconfigফাইলটিতে একটি উপন্যাস হিসাবে নিম্নলিখিতটি যুক্ত করেছি :

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

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


2

এর পাওয়ারশেল সংস্করণ git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

আপনি মাস্টার শাখায় থাকাকালীন এটি যে কোনও স্থানীয় শাখা মাস্টারের সাথে একীভূত হয়েছে তা সরিয়ে ফেলবে ।

git checkout master বদলাতে.


1

শ্লেইসের রূপটি আমার পক্ষে কাজ করে না (উবুন্টু ১২.০৪), সুতরাং আমার (পরিষ্কার এবং চকচকে :) রূপগুলি প্রস্তাব দিন:

বৈকল্পিক 1 (আমি এই বিকল্পটি পছন্দ করব):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

বৈকল্পিক 2:

ক। ড্রাই রান:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

খ। শাখা সরান:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D

1

উইন্ডোজ ব্যবহারকারীদের জন্য @ উইশবাকির উত্তরটির একটি রূপান্তর নীচে দেওয়া হয়েছে:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

আমি পশ-গিট ব্যবহার করি এবং দুর্ভাগ্যক্রমে পিএস forউলঙ্গকে পছন্দ করে না , তাই আমি প্রুনঅরফ্যানব্যাঞ্চস.এমডি নামে একটি সরল 'কমান্ড স্ক্রিপ্ট তৈরি করেছি:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

কোনও তালিকা দেখার জন্য কোনও প্যারামিটার ছাড়াই এটি কল করুন এবং তারপরে একে একে "-d" দিয়ে কল করুন যাতে কোনও সংশ্লেষ সম্পূর্ণরূপে একীভূত নয় তবে আপনি যেভাবে মুছে ফেলতে চান সেগুলির জন্য "-D" দিয়ে।


এটি আমার পক্ষে কাজ করে নি, কোনওভাবে :বা : (কোনও স্থান দিয়ে) এর findstrফলে এটি প্রতিটি সময় মিলে যায় - আমি প্রায় মাস্টারকে মুছে ফেলেছিলাম। তবে, একটি রেজেক্স ব্যবহার করে সূক্ষ্মভাবে কাজ করেছে:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
জোশ

1

মুছে ফেলা শাখাগুলির রেফারেন্সগুলি আনা এবং ছাঁটাই করতে গিট ব্যাশে এটি ব্যবহার করে দেখুন এবং তারপরে স্থানীয় শাখাগুলি ছাঁটাই করুন যা মুছে ফেলাগুলি অনুসরণ করছে:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

মুছে ফেলা হবে না এমন একটি শাখা চেকআউট করার আগে মনে রাখবেন, যাতে শাখাটি মোছার পথে বাধা দেয় না।


0

আমি গৃহীত উত্তরটিকে একটি শক্তিশালী স্ক্রিপ্টে পরিণত করেছি। আপনি এটা পাবেন আমার Git এক্সটেনশানসমূহ সংগ্রহস্থলের মধ্যে

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>

0

আমি "স্থানীয়ভাবে চেক আউট শাখাগুলি যেগুলি এখন আর প্রবাহের শাখা নেই" মুছতে পারে তার উত্তর চেয়ে আমি এই পৃষ্ঠায় পৌঁছেছি

স্থানীয় শাখাটি এখনও মেশানো হয়েছে কিনা তাও আমি git branch -dপাত্তা দিইনি , যেহেতু পাইপগুলি সরানো স্থানীয় শাখাগুলি মুছে ফেলার পরিবর্তে কেবল সতর্ক করবে।

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff


0

এখানে আমার সমাধান:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p হ'ল রিমোটে থাকা কোনও রিমোট-ট্র্যাকিং রেফারেন্সগুলি সরিয়ে ফেলা। সুতরাং প্রথম পদক্ষেপ দূরবর্তী শাখাগুলির উল্লেখগুলি সরিয়ে ফেলবে।

  • -vv প্রতিটি মাথার জন্য sha1 এবং সাবজেক্ট লাইন প্রদর্শন করার জন্য, পাশাপাশি উজানের শাখার সাথে সম্পর্কযুক্ত (যদি থাকে) for ২ য় পদক্ষেপে সমস্ত স্থানীয় শাখা পাবেন এবং গ্রেপ কমান্ড মুছে ফেলা শাখাগুলি ফিল্টার করবে out



-3

আমি নিশ্চিত যে git remote prune originআপনি চান এটি।

কোনও পরিবর্তন না করে এটি git remote prune origin --dry-runকী করবে তা দেখতে আপনি এটি চালাতে পারেন ।


12
এটি আসলে স্থানীয় শাখা নিজেই সরাবে না।
তিত্তে

-17

জিইউআই ব্যবহার করছেন? ম্যানুয়াল পদ্ধতি, তবে দ্রুত এবং সহজ।

$ git gui

"শাখা -> মুছুন" নির্বাচন করুন। আপনি সিটিআরএল-ক্লিক (উইন্ডোজ) দিয়ে একাধিক শাখা নির্বাচন করতে পারেন এবং সেগুলি সব সরাতে পারেন।


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