আপনি কি গিট দিয়ে এক কমান্ডে একাধিক শাখা মুছতে পারবেন?


355

উদাহরণস্বরূপ: আমি আমার স্থানীয় সংগ্রহস্থলের, যা পুরাতন শাখা একটি টন আছে পরিষ্কার করতে চাই 3.2, 3.2.1, 3.2.2, ইত্যাদি

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

git branch -D 3.2.*

এবং সমস্ত 3.2.x শাখা হত্যা।

আমি সেই আদেশটি চেষ্টা করেছিলাম এবং এটি অবশ্যই কার্যকর হয়নি।


11
git branch -D $(git branch | grep 3.2*)- এটা আমার জন্য কাজ করেছে। এটি "3.2" দিয়ে শুরু হওয়া শাখাগুলি মুছে দেয়। grep- আউটপুট ( git branchএই ক্ষেত্রে) প্যাটার্ন মিল । $()- মানে কার্যকর করা এবং ফলাফল স্থাপন করা। |- শিকল।
এডুয়ার্ড

4
যারা জানেন না তাদের জন্য লক্ষ্য করা, এটি -Dএকটি বল মুছে ফেলা, -dবেশিরভাগ ক্ষেত্রে প্রথমে নিরাপদ হওয়া উচিত ।
redfox05

উত্তর:


363

সিনট্যাক্সের সাথে নয়। তবে আপনি এটি এর মতো করতে পারেন:

git branch -D 3.2 3.2.1 3.2.2

মূলত, গিট শাখা আপনার জন্য একক অনুরোধ সহ একাধিক শাখা মুছে ফেলবে। দুর্ভাগ্যক্রমে এটি শাখার নাম সম্পূর্ণ করে না। যদিও, ব্যাশে, আপনি এটি করতে পারেন:

git branch -D `git branch | grep -E '^3\.2\..*'`

2
সম্পূর্ণরূপে git branch -D/-dআমার জন্য কাজ করে । আপনার আপডেট করতে পারে (সম্ভবত অতি সাম্প্রতিক git.git অবদান ডিরেক্টরি থেকে)।
ক্যাসকেবেল

19
পরিবর্তে git branch | ...আপনি ব্যবহার করতে পারে $(git for-each-ref --format='%(refname:short)' refs/heads/3.*)। এটা তোলে দীর্ঘ হওয়ার, আমি জানি, কিন্তু এটা, উপযুক্ত আউটপুট হতে নিশ্চিত হচ্ছে যখন git branchমত বিষয়গুলিতে চমত্কার আউটপুট হয়েছে *এবং ->(symrefs জন্য) যা করতে পারেন স্ক্রিপ্ট / এক-liners, মধ্যে জগাখিচুড়ি আপ করুন।
ক্যাসকেবেল

3
হয়তো আমি শুধুমাত্র এই সমস্যা এক, কিন্তু আমি করেছি grepওরফে সবসময় পতাকা অন্তর্ভুক্ত --color=always- git branch -Dনিক্ষেপ ছিল error: branch 'my_branch' not found.যতক্ষণ না আমি রং পতাকা ছাড়া দৌড়ে।
eebbesen

আপনি কি এটি বিশ্বব্যাপী নিষ্ক্রিয় করেছেন? দৌড়ানোর সময় আমি একই ইস্যুতে git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
দৌড়েছি

2
ব্রেস প্রসারণের সাহায্যে আপনি git branch -D 3.2{,.1,.2}তিনটি শাখা মুছে ফেলতে লিখতে পারেন gnu.org/software/bash/manual/html_node/Brace-Expansion.html
রোবস্টারব

147

ভাল, সবচেয়ে খারাপ ক্ষেত্রে, আপনি ব্যবহার করতে পারেন:

git branch | grep '3\.2' | xargs git branch -d

22
এটি শাখার নামগুলির জন্য আদর্শ মানের উপসর্গ চিহ্নটি ব্যবহার করে এমন কারও পক্ষে সঠিক পদ্ধতি (যেমন "ফিক্স / ..." বা "বৈশিষ্ট্য / ...")।
হাজ

4
সহজ এবং দক্ষ! আমি | xargs git branch -dআসলে কী মুছে ফেলা হচ্ছে তা যাচাই করার জন্য অংশ ছাড়াই প্রথমে চলার পরামর্শ দিই ।
মাথিওলো

এটি পড়ার জন্য বোঝানো হিসাবে, পার্সিং না grepকরে আউটপুট না করার পরামর্শ দেওয়া হয় git branch। যে কোনও সময় পরিবর্তন করতে পারে। অন্যান্য উত্তরের পরামর্শ অনুযায়ী প্যারামগুলির for-each-refসাথে একসাথে ব্যবহার করুন --formatএবং তারপরে এই উত্তরের পরামর্শগুলির সাথে একত্রিত করুন।
redfox05

138
git branch  | cut -c3- | egrep "^3.2" | xargs git branch -D
  ^                ^                ^         ^ 
  |                |                |         |--- create arguments
  |                |                |              from standard input
  |                |                |
  |                |                |---your regexp 
  |                |
  |                |--- skip asterisk 
  |--- list all 
       local
       branches

সম্পাদনা করুন:

একটি নিরাপদ সংস্করণ (জাকুব নারাবস্কি এবং জেফ্রোমি প্রস্তাবিত), যেমন গিট ব্রাঞ্চ আউটপুট স্ক্রিপ্টিংয়ের জন্য ব্যবহৃত হয় না:

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D

... বা xargs- মুক্ত:

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`

14
git branchস্ক্রিপ্টিংয়ের জন্য আউটপুট ব্যবহার করবেন না । ব্যবহার git for-each-ref
জাকুব নরবস্কি

1
@ চিহ্ন সহ ট্যাগগুলি মুছে ফেলার জন্য:git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
thaddeusmt

টাইপো আছে "/ ৩.২/২০১" "" / ৩.২.২০ "হওয়া উচিত। এছাড়াও, উপস্থিত অন্যান্য অনুলিপিগুলি আপনার নিজের মধ্যে অনুলিপি করে রেখেছেন appears
সর্বাধিক ম্যাকলিয়ড

এখানে কোনও টাইপ নেই। ম্যান পৃষ্ঠা থেকে:If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
গাভি

1
যারা জানেন না তাদের জন্য লক্ষ্য করা, এটি -Dএকটি বল মুছে ফেলা, -dবেশিরভাগ ক্ষেত্রে প্রথমে নিরাপদ হওয়া উচিত ।
redfox05

115

আপনি যোগ্য শাখাগুলির তালিকা তৈরি করতে গিট শাখা - তালিকা ব্যবহার করতে পারেন, এবং যোগ্য শাখাগুলি অপসারণ করতে গিট শাখা -D / -d ব্যবহার করতে পারেন।

একটি লাইনারের উদাহরণ:

git branch -d `git branch --list '3.2.*'`

আমি যখন এটি চেষ্টা করি, তখন আমি বেশ কয়েকটি ত্রুটি বার্তাগুলি পাই error: branch 'package.json' not found.। দেখে মনে হচ্ছে যে * খুব তাড়াতাড়ি প্রসারিত হয়েছে এবং এটি প্রতিটি ফাইল এবং ডিরেক্টরির নামের সাথে সম্পর্কিত একটি শাখা মুছে ফেলার চেষ্টা করে।
অ্যান্টিমনি

এটি ভাল কাজ করে! gitconfigযদিও এটিকে একটি উপন্যাস হিসাবে ব্যবহার করতে আমার সমস্যা হচ্ছে ...
whomanac

6
এই উত্তরটি তালিকার উচ্চতর হওয়া দরকার, সুপার ক্লিন, কোনও
গ্রেপ

1
খুব ভাল যে এই প্রথম পরীক্ষা করা সহজ জারি করেই git branch --list '3.2.*'
হবে

3
উইন্ডোগুলিতেgit branch -d (git branch --list '3.2.*').trim()
ম্যাটিয়াস জোসেফসন

38

সম্প্রতি, আমি একই সমস্যার সমাধান খুঁজছিলাম, অবশেষে আমি একটি উত্তর পেয়েছি এবং এটি খুব ভালভাবে কাজ করছে:

  1. টার্মিনাল বা সমতুল্য খুলুন।
  2. গিট শাখায় টাইপ করুন | মুছে ফেলা হবে এমন শাখাগুলির একটি পূর্বরূপের জন্য গ্রেপ "প্যাটার্ন"।
  3. গিট শাখায় টাইপ করুন | গ্রেপ "প্যাটার্ন" | xargs গিট শাখা -D

এই সমাধানটি দুর্দান্ত and এবং যদি আপনি প্রতিটি কমান্ডের পুরো ব্যাখ্যা চান এবং এটি কীভাবে কাজ করছে তবে এটি এখানে দেওয়া আছে


28

ব্যবহার

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D

7
ছোট্ট টিপটি হ'ল আপনি যদি "| xargs গিট ব্রাঞ্চ -D" কমান্ডের উত্তর অংশটি সরিয়ে ফেলেন তবে এটি কেবল মিলে যাওয়া শাখাগুলি আউটপুট করবে। সুতরাং, আপনি শাখা যে মুছে ফেলা হবে পূর্বরূপ দেখতে পারেন
ম্যাক্স ম্যাকলিয়ড

1
এছাড়াও আমি এটিকে সহজ করার জন্য একটি উপনাম যুক্ত করেছি: alias grefs='git for-each-ref --format="%(refname:short)"'তাই আমি তখন করতে পারিgrefs | grep 'regexpattern' | xargs git branch -D
অ্যাঙ্গুলারসেন

ভাল লাগল। সুন্দর এবং সহজ!
ভড়গব পোনাপল্লি

15

আপনি এটি দরকারী পাবেন:

যদি আপনি সমস্ত শাখা মুছে ফেলতে চান যা উদাহরণস্বরূপ 'মাস্টার', 'ফু' এবং 'বার' নয়

git branch -D `git branch | grep -vE 'master|foo|bar'`

গ্রেপ-ভি 'কিছু' হ'ল বিপরীতমুখী একটি ম্যাচার।


আমি ব্যক্তিগতভাবে -Dঅন্যান্য উত্তরের সাথে তুলনা করতে পছন্দ করি । উত্তর এখানে উত্তর দেওয়ার জন্য ধন্যবাদ। সমাধানগুলি আমার পক্ষে কাজ করে।
AMIC MIN

9

এই সঠিক কারণে আমি শাখা নামের প্রথম তিনটি অক্ষর হিসাবে আমার আদ্যক্ষর এবং একটি ড্যাশ (এট) রেখেছি:

git branch -D `git branch --list 'at-*'`

সমস্ত উত্তরই মূলত এটি বলে, এটি সর্বাধিক সাধারণ হিসাবে ঘটে।
tfantina

7

আপনি যদি গিট কমান্ড প্রম্পট ব্যবহারের মধ্যে সীমাবদ্ধ না হন, তবে আপনি সর্বদা git guiশাখা চালনা এবং মেনু আইটেমটি মুছতে পারেন। আপনি মুছে ফেলতে চান এমন সমস্ত শাখাগুলি নির্বাচন করুন এবং এটি ফেটে দিন।


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

7

পাওয়ারশেল সমাধান:

আপনি যদি উইন্ডো চালাচ্ছেন, আপনি একাধিক শাখা একবারে সরানোর জন্য পাওয়ারশেল ব্যবহার করতে পারেন ...

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

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



5

আমি একটি ছোট ফাংশন তৈরি করেছি যা @ গাওয়ির (উপরে) প্রদত্ত উত্তরের ভিত্তিতে কার্যকর হতে পারে।

removeBranchesWithPrefix() {
  git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}

এটি আপনার যুক্ত করুন .bash_profile এবং আপনার টার্মিনালটি পুনরায় চালু করুন। তারপরে আপনি কমান্ড-লাইন থেকে এভাবে কল করতে পারেন:

removeBranchesWithPrefix somePrefix

বিঃদ্রঃ

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


5

আপনার যদি সত্যিই আপনার সমস্ত শাখা পরিষ্কার করার প্রয়োজন হয় তবে চেষ্টা করুন

git branch -d $(git branch)

আপনি বর্তমানে যা যা পরীক্ষা করছেন তা বাদে এটি আপনার সমস্ত স্থানীয় মার্জ করা শাখা মুছে ফেলবে।

আপনার স্থানীয় পরিষ্কার করার এটি একটি ভাল উপায়


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

3

আপনি এই ছোট্ট আইটেমটি পছন্দ করতে পারেন ... এটি তালিকাটি টেনে নিয়েছে এবং শেষ পর্যন্ত সমস্ত নির্বাচন মুছে ফেলার আগে প্রতিটি আইটেমের নিশ্চয়তার জন্য জিজ্ঞাসা করে ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

মুছে ফেলার জন্য বাধ্যতামূলক করতে -D ব্যবহার করুন (যথারীতি)।

পঠনযোগ্যতার জন্য, এখানে লাইন দিয়ে বিচ্ছেদী রেখাটি ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
    while read -r line; do 
        read -p "remove branch: $line (y/N)?" answer </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

এখানে xargs পদ্ধতির ...

git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

অবশেষে, আমি আমার .bashrc এ থাকতে চাই

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

এইভাবে আমি বলতে পারি

gitSelect | xargs git branch -D.

3

খাঁটি আত্মাদের জন্য যারা এখানে ছোট স্ক্রিপ্টটি পাওয়ারশেল ব্যবহার করে git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })


2

এটি আমার পক্ষে সঠিকভাবে কাজ করে:

git branch | xargs git branch -d

git branch | xargs git branch -D

সমস্ত স্থানীয় শাখা মুছুন


2

সমস্ত শাখা অপসারণ করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন (চেক আউট শাখাটি মোছা হবে না)।

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

সম্পাদনা: আমি একটি ম্যাক ওস ব্যবহার করছি


0

আমি উইন্ডোতে আছি, আপনি এটি করার জন্য পাওয়ারশেল ব্যবহার করতে পারেন:

 git branch | grep 'feature/*' |% { git branch -D $_.trim() }

feature/*আপনার পছন্দ মতো কোনও প্যাটার্ন দিয়ে প্রতিস্থাপন করুন ।


6
গ্রেপ আমার জন্য একটি স্বীকৃত সেন্টিমিডলেট ... তাই আমি এই গিট শাখার জন্য পরিবর্তন করেছি | যেখানে {$ _। ট্রিম ()। স্টার্টস উইথ ("বাগ")} | % {গিট শাখা -D $ _। ট্রিম ()} এবং কাজ করেছেন!
অ্যালেক্স

0

আপনি এই আদেশটি ব্যবহার করতে পারেন: git branch -D $(printf "%s\n" $(git branch) | grep '3.2')



0

আপনি git guiএকবারে একাধিক শাখা মুছতে ব্যবহার করতে পারেন । কমান্ড প্রম্পট / বাশ -> git gui-> রিমোট -> শাখা মুছুন ... -> আপনি মুছে ফেলতে চান এমন দূরবর্তী শাখাগুলি নির্বাচন করুন -> মুছুন।


0

আমি আজ অপ্রচলিত স্থানীয় / প্রত্যন্ত শাখাগুলির একটি বড় সেট পরিষ্কার করেছি।

নীচে আমি এটি কীভাবে করেছি:

1. একটি পাঠ্য ফাইলে সমস্ত শাখার নাম তালিকাভুক্ত করুন:

গিট শাখা -a >> শাখার নাম। টেক্সট

2. "গিট ব্রাঞ্চ-ডি-আর" কমান্ড করতে আমি যে শাখাগুলি মুছতে চাই তা যুক্ত করুন:

গিট শাখা -ডি -আর উত্স / দির / শাখা01 উত্স / ডিআরবি / শাখা02 উত্স / ডিআরসি / শাখা03 (... যা শাখার নাম যুক্ত করুন)

3. সেমিডি এক্সিকিউট করুন

এবং এটি " গিট পুশ অরিজিন - ডিলিটের চেয়ে অনেক দ্রুত এবং নির্ভরযোগ্য কাজ করে " এর ।

অন্যান্য উত্তরের তালিকা অনুসারে এটি সর্বাধিক স্মার্ট উপায় নাও হতে পারে তবে এটি একদম সোজা এগিয়ে, এবং সহজেই ব্যবহারযোগ্য।


0

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


0

যদি আপনি ফিশ শেল ব্যবহার করে থাকেন তবে আপনি stringফাংশনগুলি উপার্জন করতে পারেন :

git branch -d (git branch -l "<your pattern>" | string trim)

অন্যান্য উত্তরগুলির কয়েকটিতে এটি পাওয়ারশেল বিকল্প থেকে খুব বেশি আলাদা নয়।


0

আপনার যদি কোনও পাঠ্য ফাইলে (শাখাগুলি থেকে ডেল। টেক্সট) (প্রতিটি লাইনে একটি শাখা) মুছতে সমস্ত শাখা থাকে তবে আপনি দূরবর্তী (উত্স) থেকে এই জাতীয় সমস্ত শাখা মুছতে এটি করতে পারেন: xargs -a branches-to-del.txt git push --delete origin


-1

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



-4

সমস্ত অপ্রয়োজনীয় রেফগুলি সরিয়ে আপনি সমস্ত শাখা মুছে ফেলতে পারেন:

rm .git/refs/heads/3.2.*


2
দুটি কারণে বঞ্চিত: ১. এটি প্রয়োগের বিশদটি ব্যবহার করে (সত্য যে গিটের বর্তমান সংস্করণগুলি একটি নির্দিষ্ট ডিরেক্টরিতে ফাইল হিসাবে শাখাগুলি সংরক্ষণ করে)। এটি ভবিষ্যতের সংস্করণগুলিতে পরিবর্তিত হতে পারে উত্তরটিকে অবৈধ করে। ২. সংগ্রহস্থলটি একটি পৃথক ডিরেক্টরিতে অবস্থিত থাকলে এটি কাজ করে না ।
axiac

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