ট্র্যাকিং শাখাগুলি আর রিমোটে সরান


1168

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

উদাহরণ:

শাখা (স্থানীয় এবং দূরবর্তী)

  • মনিব
  • মূল / মাস্টার
  • মূল / বাগ-ফিক্স-একটি
  • মূল / বাগ-ফিক্স-B
  • মূল / বাগ-ফিক্স-C

স্থানীয়ভাবে, আমার কেবল একটি মাস্টার শাখা রয়েছে। এখন আমাকে বাগ-ফিক্স-এ কাজ করা দরকার , তাই আমি এটি পরীক্ষা করে দেখি, এটিতে কাজ করি এবং রিমোটে পরিবর্তনগুলি ঠেকাই। পরবর্তী আমি বাগ-ফিক্স-বি দিয়ে একই করব ।

শাখা (স্থানীয় এবং দূরবর্তী)

  • মনিব
  • বাগ-ফিক্স-একটি
  • বাগ-ফিক্স-B
  • মূল / মাস্টার
  • মূল / বাগ-ফিক্স-একটি
  • মূল / বাগ-ফিক্স-B
  • মূল / বাগ-ফিক্স-C

এখন আমার কাছে স্থানীয় শাখা মাস্টার , বাগ-ফিক্স-এ , বাগ-ফিক্স-বি রয়েছে । মাস্টার শাখা রক্ষণাবেক্ষণকারী মধ্যে আমার পরিবর্তনগুলি মার্জ করবে মাস্টার এবং সমস্ত শাখা তিনি ইতিমধ্যেই মিশে গিয়ে তৈরি করেছে মুছে দিন।

সুতরাং বর্তমান অবস্থা এখন:

শাখা (স্থানীয় এবং দূরবর্তী)

  • মনিব
  • বাগ-ফিক্স-একটি
  • বাগ-ফিক্স-B
  • মূল / মাস্টার
  • মূল / বাগ-ফিক্স-C

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

এটি বিদ্যমান কমান্ডের মতো কিছু হবে git remote prune originতবে আরও পছন্দ git local prune origin

উত্তর:


1277

git remote prune origin prunes ট্র্যাকিং শাখা দূরবর্তী উপর না।

git branch --merged বর্তমান শাখায় একত্রিত করা শাখাগুলি তালিকাবদ্ধ করে।

xargs git branch -d স্ট্যান্ডার্ড ইনপুট তালিকাভুক্ত শাখা মুছে ফেলা।

তালিকাভুক্ত শাখাগুলি মুছে ফেলার বিষয়ে সাবধানতা অবলম্বন করুন git branch --merged। তালিকায় অন্তর্ভুক্ত থাকতে পারে masterবা অন্য শাখাগুলি আপনি মুছতে পছন্দ করেন না।

শাখাগুলি মোছার আগে নিজেকে তালিকা সম্পাদনা করার সুযোগ দেওয়ার জন্য, আপনি এক লাইনে নিম্নলিখিতটি করতে পারেন:

git branch --merged >/tmp/merged-branches && \
  vi /tmp/merged-branches && xargs git branch -d </tmp/merged-branches

17
মার্জ করা শাখাগুলির প্রথম লাইনটি * masterআমার সিস্টেমে রয়েছে। নিম্নলিখিত কমান্ডটি আমার পক্ষে কাজ করেছে:git branch -d $(git branch --merged |tail -n +2)
ট্রেন্ডফিশার

99
আমি যদি তবে থাকি developতবে git branch --mergedঅন্তর্ভুক্ত master! আপনি সম্ভবত (অবশ্যই!) এটি মুছতে চান না। এছাড়াও আমি মনে করি এটি হ'ল git branch -dযেখানে ছোট হাতের -dঅর্থ "নিরাপদ মুছুন" উদাহরণস্বরূপ, শুধুমাত্র যদি একত্রিত করা হয় তবে মুছুন।
thom_nic

11
মনে হয় সেখানে উন্নত সমাধান সরবরাহ করা হয়েছে
সের্গেই ব্রুনোভ

34
সরানো মার্জটি দরকারী, তবে "রিমোটে নেই শাখাগুলি সরান" এর মতো নয়।
dlsso

11
মাস্টারকে বাদ দিতে কেবল git branch --merged | grep -v "master" >/tmp/merged-branches && vi /tmp/merged-branches && xargs git branch -d </tmp/merged-branches
গ্রেপ

587

আদেশের পরে

git fetch -p

রিমোট রেফারেন্সগুলি সরিয়ে দেয়, যখন আপনি চালান

git branch -vv

এটি দূরবর্তী স্থিতি হিসাবে 'চলে গেছে' প্রদর্শিত হবে। উদাহরণ স্বরূপ,

$ git branch -vv
  master                 b900de9 [origin/master: behind 4] Fixed bug
  release/v3.8           fdd2f4e [origin/release/v3.8: behind 2] Fixed bug
  release/v3.9           0d680d0 [origin/release/v3.9: behind 2] Updated comments
  bug/1234               57379e4 [origin/bug/1234: gone] Fixed bug

সুতরাং আপনি স্থানীয় শাখাগুলি রিমোট হয়ে গেছে তা সরানোর জন্য একটি সাধারণ স্ক্রিপ্ট লিখতে পারেন:

git fetch -p && for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do git branch -D $branch; done

নোট করুন যে উপরের git branchস্ট্রিমের স্ট্যাটাসটি পেতে "পোরসিলাইন" কমান্ডটি ব্যবহার করে ।

এই স্থিতিটি পাওয়ার আরও একটি উপায় হ'ল "নদীর গভীরতানির্ণয়" কমান্ডটি git for-each-refইন্টারপোলেশন ভেরিয়েবলের সাথে ব্যবহার করা %(upstream:track)হবে যা [gone]উপরের মত হবে ।

এই পদ্ধতিটি কিছুটা নিরাপদ, কারণ প্রতিশ্রুতি বার্তার অংশে দুর্ঘটনাক্রমে কোনও মিল হওয়ার ঝুঁকি নেই।

git fetch -p && for branch in $(git for-each-ref --format '%(refname) %(upstream:track)' refs/heads | awk '$2 == "[gone]" {sub("refs/heads/", "", $1); print $1}'); do git branch -D $branch; done

8
@ ক্রজিৎসটোফওয়ান্দে - সোলারিস এবং কিছু বিএসডি এবং কিছু ওএস এক্স এ নয় :)
jww

4
দেখে মনে হচ্ছে এটি সর্বশেষ কমিট বার্তায় যে কোনও শাখা "চলে গেছে" মুছে ফেলবে।
dlsso

11
@dlsso যদি শেষ প্রতিশ্রুতি বার্তায় ": চলে গেছে]" স্ট্রিং থাকে তবে হ্যাঁ এটিও সরানো হবে। প্রতিশ্রুতি বার্তাটি সরিয়ে দেওয়ার জন্য অতিরিক্ত বেত্র / গৌক দিয়ে আপনি সরলতার ব্যয়ে এটিকে আরও দৃ rob় করতে পারেন। git branch -vv | gawk '{print $1,$4}' | grep 'gone]' | gawk '{print $1}'
জেসন.ক্রিকম্যান

2
আমার পূর্ববর্তী মন্তব্যের (প্রশ্নের) জবাবে, বর্তমান শাখার প্রথম ক্ষেত্র হিসাবে * রয়েছে। যদি এটি "চলে যাওয়া" শাখাগুলির তালিকায়ও থাকে, assigned 1 নির্ধারিত হবে * এবং ফাইল এবং ফোল্ডারের নাম বিশিষ্টভাবে আলাদা করে একটি ফাইলস্পেক হিসাবে ব্যাখ্যা করা হবে। আমি, grep অভিব্যক্তি কাটানো এবং ফিল্টারিং সব করতে awk করেছেন: awk '/: gone]/{if ($1!="*") print $1}'। এটি এখন প্রত্যাশার মতো কাজ করে।

5
@ অহম্মদ্বস যেহেতু কমান্ডটি একক উদ্ধৃতি ব্যবহার করেছে 'পুরো কমান্ডকে ঘিরে আপনার "ডাবল উদ্ধৃতি" ব্যবহার করতে হবে। এছাড়াও, শিট কমান্ড (যেমন এইরকম) গিট এলিয়াস শুরুতে প্রয়োজন! এটি আমার পক্ষে কাজ করে:test = "!git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done"
জেসন.ট্রিকম্যান

305

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

  1. আপনার ডিফল্ট শাখা পরীক্ষা করে দেখুন। সাধারণতgit checkout master
  2. চালান git fetch -p && git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d

ব্যাখ্যা:

আপনার ট্র্যাকিং শাখাগুলি ছাঁটাই করে কাজ করে তারপরে লোকালগুলি মুছে ফেলা যা তারা দেখায় যে তারা "চলে গেছে" git branch -vv

মন্তব্য:

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


2
ফরাসি ওএসের জন্য বৈষম্যের মাধ্যমে পরিবর্তন করতে হবে
মোহাম্মদ ই এল

4
ইংরাজিকে বলপূর্বক গিট শাখার আগে LANG = en_US যুক্ত করা উচিত: গিট ফেচ - প্রিন ও& LANG = en_US গিট শাখা -vv | awk '/: চলে গেছে] / {মুদ্রণ $ 1}' | xargs git শাখা -d
মোহাম্মদ EL HABIB

3
git checkout master && ...কমান্ডের শুরুতে আমি যুক্ত করব ।
ইয়ারায়ো

2
এটি মুছে ফেলা উচিত বলে মনে করা এমন একটি শাখায় থাকাকালীন এটি বিপজ্জনক - সেই ক্ষেত্রে প্রথম কলামটি '*', যা পরে xargs এ দেওয়া হয়। এটির উন্নতি করতে, আউটপুট অস্থির করার আগে '*' অক্ষরটি যুক্ত করুন: সেড-ই '/ ^ * //'
মীইউ

6
সাবধান হন! একটি প্রান্তের কেস রয়েছে যা ফলস্বরূপ আপনার সমস্ত স্থানীয় শাখাগুলি মুছবে: আপনি যদি বর্তমানে এমন একটি শাখায় রয়েছেন যা রিমোটে মুছে ফেলা হয় তবে git branch -vvএকটি আউটরিজ দিয়ে আউটপুট শুরু হবে যা পরিণতিতে মৃত্যুদন্ড কার্যকর করবে git branch -d *। এখানে একটি প্যাচযুক্ত সংস্করণ যা তারকাচিহ্নযুক্ত রেখাগুলি উপেক্ষা করবে:git branch -vv | grep ': gone]'| grep -v "\*" | awk '{ print $1; }' | xargs -r git branch -d
কেএমসিএম

209

আমি ইতিমধ্যে একটি প্রশ্নের উত্তর দেবো না যার ইতিমধ্যে 16 টি উত্তর রয়েছে তবে অন্য সমস্ত উত্তরগুলি ভুল এবং সঠিক উত্তরটি এত সহজ। প্রশ্নটি বলে, "সমস্ত ট্র্যাকিং শাখাগুলি মুছে ফেলার কি সহজ উপায় আছে যার দূরবর্তী সমতুল্য আর নেই?"

যদি "সরল" অর্থ হ'ল একসাথে সবগুলি মুছে ফেলা, ভঙ্গুর নয়, বিপজ্জনক নয়, এবং সমস্ত পাঠকের কাছে থাকা সরঞ্জামগুলির উপর নির্ভর না করে, তবে সঠিক উত্তরটি হ'ল: না।

কিছু উত্তর সহজ, তবে তারা যা বলেছিল তা করে না। অন্যরা যা জিজ্ঞাসিত হয়েছিল তা করে, তবে সহজ নয়: সকলেই টেক্সট-ম্যানিপুলেশন কমান্ড বা স্ক্রিপ্টিং ভাষার মাধ্যমে গিট আউটপুট পার্সিংয়ের উপর নির্ভর করে, যা প্রতিটি সিস্টেমে উপস্থিত থাকতে পারে না। তারপরে, বেশিরভাগ পরামর্শই পোরস্লেইন কমান্ড ব্যবহার করে, যার আউটপুট স্ক্রিপ্ট দ্বারা বিশ্লেষণের জন্য ডিজাইন করা হয়নি ("চীনামাটির বাসন" মানবিক ক্রিয়াকলাপের উদ্দেশ্যে চিহ্নিত আদেশগুলি বোঝায়; স্ক্রিপ্টগুলিকে নিম্ন স্তরের "নদীর গভীরতানির্ণয়" কমান্ড ব্যবহার করা উচিত)।

আরও পড়া:


যদি আপনি এটি নিরাপদে করতে চান তবে প্রশ্নের ক্ষেত্রে ব্যবহারের ক্ষেত্রে (আবর্জনা-সংগ্রহ ট্র্যাকিং শাখাগুলি যা সার্ভারে মুছে ফেলা হয়েছে তবে এখনও স্থানীয় শাখা হিসাবে বিদ্যমান রয়েছে) এবং কেবলমাত্র উচ্চ-স্তরের গিট কমান্ড সহ, আপনাকে করতে হবে

  • git fetch --prune(বা git fetch -p, যা একটি উপনাম, বা git prune remote originআনতে ছাড়া একই কাজ করে এবং সম্ভবত আপনি বেশিরভাগ সময় যা চান তা সম্ভবত নয়)।
  • মুছে ফেলা হিসাবে রিপোর্ট করা যে কোনও দূরবর্তী শাখা নোট করুন। বা এগুলি পরে খুঁজে পেতে git branch -v(কোনও অনাথ ট্র্যাকিং শাখা "[[]] চিহ্নিত করা হবে)।
  • git branch -d [branch_name] প্রতিটি অনাথ ট্র্যাকিং শাখায়

(যা অন্য কয়েকটি উত্তর প্রস্তাব করে)।

আপনি যদি কোনও সমাধানের স্ক্রিপ্ট করতে চান, তবে for-each-refএটিই আপনার প্রারম্ভিক পয়েন্ট, যেমন মার্ক লংএয়ারের উত্তর এবং এখানে অন্য প্রশ্নের উত্তর রয়েছে , তবে আমি শেল স্ক্রিপ্ট লুপ না লিখে, বা xargs বা কিছু ব্যবহার না করে এটিকে কাজে লাগানোর উপায় দেখতে পাচ্ছি না ।


পটভূমি ব্যাখ্যা

কী হচ্ছে তা বোঝার জন্য, আপনাকে প্রশংসা করতে হবে, ট্র্যাকিং শাখার পরিস্থিতিতে আপনার একটি শাখা নয়, তিনটি রয়েছে। (এবং মনে রাখবেন যে "শাখা" এর অর্থ কেবল একটি অঙ্গীকারের নির্দেশক))

একটি ট্র্যাকিং শাখা দেওয়া feature/X, দূরবর্তী সংগ্রহস্থল (সার্ভার) এর এই শাখা থাকবে এবং এটি কল করবে feature/X। আপনার স্থানীয় সংগ্রহস্থলের একটি শাখা রয়েছে remotes/origin/feature/Xযার অর্থ, "এটিই দূরবর্তী আমাকে তার বৈশিষ্ট্যটি বলেছিল / এক্স শাখাটি ছিল, শেষ বার আমরা কথা বললাম" এবং শেষ অবধি, স্থানীয় সংগ্রহস্থলের একটি শাখা রয়েছে feature/Xযা আপনার সর্বশেষ প্রতিশ্রুতিতে নির্দেশ করে এবং এতে কনফিগার করা হয়েছে "ট্র্যাক" remotes/origin/feature/X, যার অর্থ আপনি এগুলিকে সারিবদ্ধ রাখতে টানতে এবং ধাক্কা দিতে পারেন।

এক পর্যায়ে, কেউ feature/Xরিমোটে থাকা মুছে ফেলেছে । সেই মুহুর্ত থেকে, আপনি আপনার স্থানীয় feature/X(যা আপনি সম্ভবত আর চান না, কারণ এক্স বৈশিষ্ট্যটির কাজ সম্ভবত সমাপ্ত) এর সাথে বাকী রয়েছেন এবং remotes/origin/feature/Xযা আপনার অবশ্যই নিরর্থক কারণ এর একমাত্র উদ্দেশ্য ছিল সার্ভারের শাখার অবস্থা মনে রাখা was ।

এবং গিট আপনাকে স্বয়ংক্রিয়ভাবে রিলান্ড্যান্ট পরিষ্কার করতে দেবে remotes/origin/feature/X- যা সেটাই git fetch --pruneকরে - তবে কোনও কারণে এটি আপনাকে স্বয়ংক্রিয়ভাবে মুছে ফেলতে দেয় না feature/X... যদিও আপনার feature/Xএখনও অনাথ ট্র্যাকিংয়ের তথ্য রয়েছে, তাই এতে তথ্য রয়েছে সম্পূর্ণরূপে একত্রিত করা পূর্ববর্তী ট্র্যাকিং শাখাগুলি সনাক্ত করতে। (সর্বোপরি, এটি আপনাকে সেই তথ্য দিতে পারে যা আপনাকে নিজেরাই অপারেশন করতে দেয়))


3
এটি অনেক বেশি নিরাপদ উত্তর। এছাড়াও, আপনি নির্বাচিত উত্তরের বিপরীতে কোনও "স্কোয়াশ এবং মার্জ" ওয়ার্কফ্লো ব্যবহার করলে এটি কাজ করবে।
জেক লেভিট

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

4
@ ভু এটি উত্তরের মূল বিষয়: এটি কীভাবে করবেন তা আপনাকে জানানোর জন্য নয় (এটি কেবলমাত্র একটি বোনাস) তবে আপনাকে উত্তর দেওয়ার জন্য উত্তরটি হ'ল এটি করার সহজ এবং সহজ উপায় নেই। এটি তৈরি করা হওয়ায় কোন প্রশ্নের সঠিক উত্তর is
অ্যান্ড্রু স্পেন্সার

1
"যদি আপনি প্রশ্নে ব্যবহারের ক্ষেত্রে নিরাপদে এটি করতে চান তবে .." - যা প্রথম অনুচ্ছেদের বেশিরভাগ দাবিকে উপেক্ষা করে। "[গিট] আপনাকে সেই তথ্য দিতে পারে যা আপনাকে নিজের হাতে অপারেশন করতে দেয়" - আমরা প্রোগ্রামাররা তাই তালিকা হিসাবে তথ্য দেওয়া (যা দেখানো হয়েছে) কাজটি এখনও সহজ (উদাঃ xargs)। এছাড়াও git aliasবেশ কয়েকটি মামলা সরল করতে হবে।
ব্যবহারকারী 2864740

2
@ ইউজার ২64646440৪০ কিছু পাঠক বিবেচনা করতে পারেন যে একটি ছোট বাশ লিপিটি লেখার বিষয়টি তাদের "সরল" সংজ্ঞায়নের মধ্যে পড়ে এবং এটি একটি সম্পূর্ণরূপে স্বীকৃত অবস্থান, তবে আমি ২ য় অনুচ্ছেদে আমার "সরল" এর নিজস্ব ব্যাখ্যা দিয়েছি এবং বাকী উত্তরটি সামঞ্জস্যপূর্ণ এর সাথে. এবং আমার স্বীকৃত নিয়ন্ত্রিত ব্যাখ্যার প্রতিরক্ষা হিসাবে, সমস্ত গিট ব্যবহারকারী xargsবা ব্যাশই নেই এবং সম্ভবত তারা এখানে কোনও মাইক্রো কোডিং চ্যালেঞ্জ খুঁজছেন না, এত দ্রুত উত্তর হিসাবে তারা তাদের আসল লক্ষ্য থেকে নিজেকে আরও বিভ্রান্ত না করে নিরাপদে প্রয়োগ করতে পারে ।
অ্যান্ড্রু স্পেন্সার

52

আমি এখানে উত্তর পেয়েছি: একত্রীকরণ করা সমস্ত গিট শাখা আমি কীভাবে মুছতে পারি?

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

আমরা মাস্টার রাখছি তা নিশ্চিত করুন

আপনি তা নিশ্চিত করতে পারেন যে master, বা অন্য কোনও শাখা grep, প্রথমটির পরে অন্য যুক্ত করে মুছে ফেলা হবে না । সেক্ষেত্রে আপনি যাবেন:

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

তাই আপনি যদি আমরা রাখতে চেয়েছিলেন master, developএবং stagingউদাহরণস্বরূপ, আমরা যেতে হবে:

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

এটি একটি উপনাম করুন

যেহেতু এটি খানিকটা দীর্ঘ, আপনি নিজের .zshrcবা কোনও কোনও উপনাম যুক্ত করতে চাইতে পারেন .bashrc। খনি বলা হয় gbpurge(জন্য git branches purge):

alias gbpurge='git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d'

তারপরে আপনার .bashrcবা .zshrc:

. ~/.bashrc

অথবা

. ~/.zshrc

8
দরকারী, তবে "রিমোটে নেই শাখাগুলি সরান" এর মতো নয়
dlsso

গ্রেট উত্তর @ কর্লিনজেন, আমি আমার সমস্ত দেব পরিবেশে এটি স্থায়ীভাবে জিবিপুর্জ হিসাবে পেয়েছি
পিটার ডোলান

50

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

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

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().Trim().Split(" ")[0]} শাখার নাম পান

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


3
এই জন্য ধন্যবাদ, যদিও আমি একটি যোগ করার জন্য ছিল .Trim()পরে .toString()শাখা নাম আগে দুই শূণ্যস্থান পরিষ্কার করার জন্য।
ম্যাথু

2
এই আদেশের জন্য ধন্যবাদ। আমাকে অন্যটিতে পরিবর্তন করতে git branch -dহয়েছিল git branch -Dআমি ত্রুটিটি পেয়েছি শাখাটি সম্পূর্ণরূপে একত্রিত হয়নি।
মার্কিও

1
@ মার্কিও আপনি সম্ভবত এটি ইতিমধ্যে জানেন, তবে অন্য কারও জন্য - git branch -Dএটি ধ্বংসাত্মক এবং আপনি যে কাজটি এখনও চালিত করেন নি সেগুলি স্থানীয় কাজ মুছে ফেলবে। -dসর্বদা সুরক্ষিত, সতর্কতা অবলম্বন করুন -D
নাট বার্বেটিনি

33

অন্যান্য সমাধানগুলির বেশিরভাগ ক্ষেত্রে "চলে গেছে" এর সাথে মিল পাওয়া প্যাটার্নটি আমার জন্য কিছুটা ভীতিজনক ছিল। আরও সুরক্ষিত হওয়ার জন্য, --formatপ্রতিটি শাখার প্রবাহের ট্র্যাকিং স্থিতিটি টানতে এটি পতাকা ব্যবহার করে ।

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

git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" | 
    ? { $_ -ne "" } | 
    % { git branch -D $_ }

প্রথম সারিতে স্থানীয় শাখাগুলির নাম তালিকাভুক্ত করা হয়েছে যার প্রবাহ শাখা "চলে গেছে"। পরবর্তী লাইনটি ফাঁকা রেখাগুলি সরিয়ে দেয় (যা শাখাগুলির জন্য আউটপুট যা "চলে যায় না"), তারপরে শাখার নামটি শাখাটি মুছে ফেলার জন্য আদেশে প্রেরণ করা হয়।


6
--formatবিকল্প মোটামুটি নতুন মনে করা হয়; আমার গিটটি 2.10. থেকে কিছু থেকে 2.16.3 এ আপগ্রেড করা দরকার। এটি লিনাক্স-ইশ সিস্টেমগুলির জন্য আমার পরিবর্তন:git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)" | sed 's,^refs/heads/,,' | grep . | xargs git branch -D
বিএক্সএম

2
এটি এখন পর্যন্ত সেরা সমাধান। একটি পরামর্শ ব্যবহার করা হয় refname:short। তারপরে আপনি লাইনটি মুছতে পারেন% { $_ -replace '^refs/heads/', '' }
আইউডাস

2
এটি উইন্ডোজের জন্য দুর্দান্ত সমাধান। আমি এটি এই কারণে ব্যবহার করছি এটি আরও পঠনযোগ্য git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" | where { $_ -ne "" } | foreach { git branch -d $_ }এছাড়াও এটির -dপরিবর্তে সম্ভবত ব্যবহার করার জন্য ভাল ধারণা -D। রিমোটে থাকা শাখাগুলির জন্য জোর করে মুছে ফেলা প্রয়োজন হবে না।
রুবানভ

31

মাস্টারে একীভূত হয়ে গেছে এমন সমস্ত শাখা সরান, তবে নিজেই মাস্টার সরিয়ে দেওয়ার চেষ্টা করবেন না:

git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)

বা একটি নাম যুক্ত করুন:

alias gitcleanlocal="git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)"

ব্যাখ্যা:

git checkout master চেকআউট মাস্টার শাখা

git pull origin master স্থানীয় শাখায় সমস্ত দূরবর্তী পরিবর্তন একত্রিত হয়েছে তা নিশ্চিত করুন

git fetch -p মুছে ফেলা হয়েছে এমন প্রত্যন্ত শাখাগুলির রেফারেন্সগুলি সরান

git branch -d $(git branch master --merged | grep master -v) মাস্টারে একত্রিত হয়ে সমস্ত শাখাগুলি মুছুন, তবে নিজেই মাস্টার সরিয়ে দেওয়ার চেষ্টা করবেন না


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

কেবল স্পষ্ট করার জন্য, জেফিরিন -D বিকল্পটি ব্যবহার করার বিষয়ে উল্লেখ করছেন যা ওয়ান-লাইনের অংশ নয়।
cs01

1
বা ছোট হাতের অংশটি জুস করুন git branch -dযা শাখাগুলি ধাক্কা না দেওয়ার বিষয়ে একটি সতর্কতা জারি করবে।
acme

16
git fetch -p

এটি এমন কোনও শাখা ছাঁটাই করবে যা দূরবর্তী স্থানে নেই।


64
এটি দূরবর্তী রেফারেন্সগুলি সরিয়ে দেয়, তবে স্থানীয় শাখাগুলি সেগুলি নয়। একটি দরকারী কমান্ড থাকা সত্ত্বেও, আমি মনে করি না এটি ওপি-র প্রশ্নের উত্তর দেয়।
thataustin

কি? এটি আমার জন্য স্থানীয় শাখাগুলি মুছে দেয়।
অ্যালেক্স হল

1
@ অ্যালেক্সহল দূরবর্তী সংগ্রহস্থলের একটি শাখা রয়েছে X; তুমি git checkout X; এখন আপনার সংগ্রহস্থলের একটি (স্থানীয়) ট্র্যাকিং শাখা Xএবং একটি দূরবর্তী শাখা রয়েছে origin/X; দূরবর্তী সংগ্রহস্থল মুছে ফেলা হয় X; তুমি git fetch-p; আপনার স্থানীয় সংগ্রহস্থলের মধ্যে না শুধুমাত্র origin/Xকিন্তু Xমুছে দেওয়া হয়েছে। তুমি কি বলছ?
অ্যান্ড্রু স্পেন্সার

16

তবুও-পাইলিকের জন্য আরেকটি উত্তর, প্যাট্রিকের উত্তর থেকে ভারী আঁকুন (যা আমি পছন্দ করি কারণ এটি আউটপুটে কোথায় gone]মিলবে তা নিয়ে কোনও অস্পষ্টতা দূর করতে পারে বলে মনে হচ্ছে git branch) তবে একটি * নিক্স বেন্ট যুক্ত করা হয়েছে।

এর সহজতম আকারে:

git branch --list --format \
  "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" \
  | xargs git branch -D

আমি এটিকে git-goneআমার পথে একটি স্ক্রিপ্টে আবৃত করেছি:

#!/usr/bin/env bash

action() {
  ${DELETE} && xargs git branch -D || cat
}

get_gone() {
  git branch --list --format \
    "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)"
}

main() {
  DELETE=false
  while [ $# -gt 0 ] ; do
    case "${1}" in
      (-[dD] | --delete) DELETE=true ;;
    esac
    shift
  done
  get_gone | action
}

main "${@}"

এনবি - --formatবিকল্পটি মোটামুটি নতুন বলে মনে হচ্ছে; আমার গিটটি 2.10. থেকে কিছু থেকে 2.16.3 এ আপগ্রেড করা দরকার।

সম্পাদনা: বেঞ্জামিন ডাব্লু এর পরামর্শ অন্তর্ভুক্ত করতে refname:shortটুইট করা হয়েছে

এনবি 2 - আমি কেবল পরীক্ষা করেছি bash, সুতরাং হ্যাশব্যাং, তবে সম্ভবত এটি বহনযোগ্য sh


প্রথম লাইনে sedব্যবহার করে আপনি কি অংশটি এড়িয়ে যেতে পারবেন না %(refname:short)?
বেনিয়ামিন ডাব্লু।

আমার পক্ষে কাজ করার জন্য মনে হচ্ছে, এবং আমার কাছে এটি এখন একটি ঝরঝরে গিট ওরফে হিসাবে রয়েছে - এগুলির সবার পরিষ্কার সমাধান!
বেনিয়ামিন ডাব্লু।

2.13 প্রবর্তিত --formatsedঅংশটি এড়িয়ে যাওয়ার আরেকটি উপায় ব্যবহার করা git update-ref -d। মনে রাখবেন এটি সম্ভবত কিছুটা নিরাপদ নয়, ব্যবহার git for-each-refকরা এখানে নিরাপদ (প্রদত্ত --shell)।
gsnedders

দুর্দান্ত উত্তর, এবং এটি আমাকে --formatনিজে করার জন্য যখন ভ্রূণুভূতি করে তখন আমার নিজের প্রশ্নের উত্তর দিতে সহায়তা করে । শুধু একটি প্রশ্ন: কেন #!bash? এখানে সবকিছু shআমার কাছে বহনযোগ্য বলে মনে হচ্ছে like
টবি স্পিড

এটি কেবলমাত্র আমার সাধারণ বয়লারপ্লেট, এবং অন্য কোথাও পরীক্ষা করে নি।
বিএক্সএম

15

মাস্টার এবং বিকাশ ব্যতীত সমস্ত স্থানীয় শাখা সাফ করার জন্য কিছু সহজ, এক লাইন উপকারী হতে পারে

git branch | grep -v "master" | grep -v "develop" | xargs git branch -D

দুর্দান্ত উত্তর! আমি পছন্দ করি 'git branch | grep -v "master" | grep -v "develop"যে কমান্ডের মুছে ফেলার অংশটি যুক্ত করার আগে কোনও ব্যক্তি কীভাবে সহজেই ধরণের জিনিস দিয়ে খেলতে পারে। 👏😊
ফাইননিচেনহেল্প

তবে এটি উপরের প্রশ্নের উত্তর দেয় না। এটি শাখা মুছে ফেলবে যদিও রিমোট এখনও রয়েছে।
জিম.বি

13

এটি স্থানীয় মাস্টার রেফারেন্স এবং বর্তমানে ব্যবহৃত ব্যবহৃত ব্যতীত সমস্ত সংযুক্ত স্থানীয় ব্রাঞ্চগুলি মুছে ফেলবে:

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

এবং এটি " উত্স " দ্বারা রেফারেন্সযুক্ত দূরবর্তী সংগ্রহ থেকে ইতিমধ্যে মুছে ফেলা সমস্ত শাখা মুছে ফেলবে , তবে স্থানীয়ভাবে " রিমোট / উত্স " এ উপলব্ধ।

git remote prune origin

git branch -vv | grep 'gone]' | grep -v "\*" | awk '{print $1}' | xargs -r git branch -d ব্যাখ্যা: আমি প্রতিস্থাপন পছন্দ git branch --mergedদ্বারা git branch -vvঅবস্থা (অতিক্রান্ত) দেখানোর জন্য পূর্ববর্তী কারণ git branch --mergedএছাড়াও মাস্টার দেখাতে পারেন
jpmottin

13

এটি করার জন্য একটি বিল্ট-ইন কমান্ড আছে বলে আমি মনে করি না তবে এটি নিম্নলিখিতটি করা নিরাপদ:

git checkout master
git branch -d bug-fix-a

আপনি যখন ব্যবহার করবেন তখন -dগিটটি শাখাটি মুছে ফেলতে অস্বীকার করবে যতক্ষণ না এটি সম্পূর্ণরূপে মার্জড হয় HEADবা এর প্রবাহের দূরবর্তী ট্র্যাকিং শাখায়। সুতরাং, আপনি সর্বদা আউটপুট থেকে লুপ করতে পারেন git for-each-refএবং প্রতিটি শাখা মুছতে চেষ্টা করতে পারেন। এই পদ্ধতির সাথে সমস্যাটি হ'ল আমার সন্দেহ হয় যে আপনি সম্ভবত bug-fix-dমুছতে চান না কেবল কারণ origin/bug-fix-dএর ইতিহাস রয়েছে। পরিবর্তে, আপনি নিম্নলিখিত হিসাবে কিছু স্ক্রিপ্ট তৈরি করতে পারে:

#!/bin/sh

git checkout master &&
for r in $(git for-each-ref refs/heads --format='%(refname:short)')
do
  if [ x$(git merge-base master "$r") = x$(git rev-parse --verify "$r") ]
  then
    if [ "$r" != "master" ]
    then
      git branch -d "$r"
    fi
  fi
done

সতর্কতা: আমি এই স্ক্রিপ্টটি পরীক্ষা করিনি - কেবল যত্ন সহ ব্যবহার করুন ...


স্ক্রিপ্ট সম্পাদনা করার জন্য আমি স্বাধীনতা নিয়েছি। তবুও কোনও গ্যারান্টি দেয় না, তবে, এটি চলছে এবং এখন কাজ করছে বলে মনে হচ্ছে।
fwielstra

13

টি এল; ডিআর:

দূরবর্তী স্থানে নেই এমন সমস্ত স্থানীয় শাখা সরান

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

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

git fetch -p && git branch --merged | grep -v '*' | grep -v 'master' | xargs git branch -d

ব্যাখ্যা

  • git fetch -p রিমোটে থাকা সমস্ত শাখা ছাঁটাই করবে
  • git branch -vv স্থানীয় শাখা মুদ্রণ করবে এবং ছাঁটাই শাখা ট্যাগ করা হবে tag gone
  • grep ': gone]' যে শাখাগুলি গেছে সেগুলি কেবল নির্বাচন করে
  • awk '{print $1}' শুধুমাত্র শাখার নাম প্রদর্শন করতে আউটপুট ফিল্টার করুন
  • xargs git branch -D সমস্ত লাইন (শাখা) উপর লুপ এবং এই শাখা সরানোর জন্য চাপ দেবে

পুরোপুরি একত্রিত হয়নি এমন শাখাগুলির জন্য কেন git branch -Dএবং না git branch -dআপনার কাছে থাকবে।

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

1
আপনি কি মাস্টারের পরিবর্তে রিমোট বলতে চান?
টিনো


7

উপরের তথ্যের ভিত্তিতে, এটি আমার পক্ষে কাজ করেছে:

git br -d `git br -vv | grep ': gone] ' | awk '{print $1}' | xargs`

এটি ': gone] 'রিমোটে থাকা সমস্ত স্থানীয় শাখাগুলি সরিয়ে দেয় ।


1
দেখে মনে হচ্ছে এটি সর্বশেষ কমিট বার্তায় যে কোনও শাখা "চলে গেছে" মুছে ফেলবে।
dlsso

এটি goneএর নামে যে কোনও শাখাও সরিয়ে ফেলবে ।
bfontaine

3
"গিট শাখা -D গিট শাখা -vv | গ্রেপ ': চলে গেছে]' | awk '{মুদ্রণ $ 1}' | xargs`" এটি আমার পক্ষে কাজ করেছিল।
মুথু গণপতি নাথান

7
grep gone <(git branch -v) | cut -d ' ' -f 3 | xargs git branch -d

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


এখনও অবধি সেরা সমাধান, যদিও আমি এটিকে পরিবর্তন করে grep gone <(git branch -v) | cut -d ' ' -f 3 | xargs git branch -Dসমস্ত মুছে ফেলতে বাধ্য করেছি
শোয়েব

বিপজ্জনক যদি আপনার কোনও শাখার নামতে সেগুলির goneযে কোনও জায়গায় সাবস্ট্রিং থাকে (যেমন usingonefunction)।
টবি স্পিড 10

7

এর কিছুই আমার পক্ষে সত্যি ছিল না। আমি এমন কিছু চাইছিলাম যা দূরবর্তী শাখাগুলি ট্র্যাক করছে এমন সমস্ত স্থানীয় শাখা মুছে ফেলবে 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, যেমন আমি আমার প্রকৃত কনফিগ না। আমি ব্যবহার করি -Dকারণ আমি গিটকে নিমজ্জিত শাখাগুলির বিষয়ে অভিযোগ শুনতে চাই না। আপনি এই কার্যকারিতাটিও চাইবেন। যদি তা হয় তবে কনফিগার কমান্ডের শেষে কেবল -Dপরিবর্তে ব্যবহার করুন -d


আমি গিট ওরফে পদ্ধতির পছন্দ করি। কুইক প্রশ্ন: কেন করছেন git branch -vvএবং জন্য greping : gone]এবং না git branch -vএবং জন্য grep [gone]?
লালিবি

@ লালবি, ভাল প্রশ্ন। মনে নেই। আমি সন্দেহ করি যে কেবল একটির সাথে কিছু প্রদর্শিত হচ্ছে না v। যদি আপনার পক্ষে git branch -v | grep '[gone]'কাজ করে তবে এটির জন্য যান। এটা একটু ক্লিনার মনে হচ্ছে।
কার্ল উইলবার

4

উপর ভিত্তি করে একবার মুছে প্রাচীন স্থানীয় শাখা: গীত টিপ , যা অনুরূপ jason.rickman এর সমাধান আমি এই উদ্দেশ্যে বলা জন্য একটি কাস্টম কমান্ড বাস্তবায়িত Git সর্বস্বান্ত ব্যাশ ব্যবহার করছে:

$ git gone
usage: git gone [-pndD] [<branch>=origin]
OPTIONS
  -p  prune remote branch
  -n  dry run: list the gone branches
  -d  delete the gone branches
  -D  delete the gone branches forcefully

EXAMPLES
git gone -pn    prune and dry run
git gone -d     delete the gone branches

git gone -pn ছাঁটাই এবং "চলে গেছে" শাখার তালিকা সংযুক্ত করে:

$ git gone -pn
  bport/fix-server-broadcast         b472d5d2b [origin/bport/fix-server-broadcast: gone] Bump modules
  fport/rangepos                     45c857d15 [origin/fport/rangepos: gone] Bump modules

তারপরে আপনি git gone -dবা ব্যবহার করে ট্রিগারটি টানতে পারেন git gone -D

মন্তব্য

  • রেগুলার এক্সপ্রেশন আমি ব্যবহার করে তা হল "$BRANCH/.*: gone]"যেখানে $BRANCHস্বাভাবিকভাবে হবে origin। আপনার গিট আউটপুটটি ফরাসি ভাষায় স্থানীয়করণ করা থাকলে সম্ভবত এটি কাজ করবে না etc.
  • সেবাস্তিয়ান উইসনার উইন্ডোজ ব্যবহারকারীদের জন্য এটি মরিচাতে পোর্ট করেছিলেন। সেই একটিকে গিট গেডও বলা হয় ।

এটি সম্ভবত স্বীকৃত উত্তর হওয়া উচিত - এটির git goneজন্য একটি উপনামের মতো দেখাচ্ছে git branch -vv | grep 'origin/.*: gone]' | awk '{print $1}' | xargs git branch -d, যা ওপিটির সমস্যা সমাধান করে।
অ্যালেক্স

4

এখানে বেশ কয়েকটি অন্যান্য উত্তর থেকে ভারী অঙ্কন করা হয়েছে, আমি নিম্নলিখিতগুলি শেষ করেছি (গিটার 2.13 এবং কেবলমাত্র উপরে, আমি বিশ্বাস করি), যা ইউনিক্সের মতো কোনও শেলটিতে কাজ করা উচিত:

git for-each-ref --shell --format='ref=%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)' refs/heads | while read entry; do eval "$entry"; [ ! -z "$ref" ] && git update-ref -d "$ref" && echo "deleted $ref"; done

এই উল্লেখযোগ্য ব্যবহার for-each-refপরিবর্তে branch(যেমন branchপাঠযোগ্য আউটপুট, না মেশিন প্রক্রিয়াকরণ জন্য ডিজাইন করা একটি "চীনামাটির বাসন" কমান্ড হয়) এবং তার ব্যবহার --shellসঠিকভাবে পলান আউটপুট আর্গুমেন্ট প্রাপ্ত করতে (এই অনুমতি দেয় আমাদের; ref name কোনো চরিত্র সম্পর্কে চিন্তা করবেন পর্যন্ত)।


এটি আমার পক্ষে কাজ করে, তবে কমান্ডের অন্যান্য পদক্ষেপগুলি কী করছে তা আপনি যদি ব্যাখ্যা করতে পারেন তবে এটিও ভাল। উদাহরণস্বরূপ আমি এর [ ! -z "$ref" ]অর্থ জানি না । আমি মনে করি একটি মাল্টি লাইনার ইতিমধ্যে সাহায্য করতে পারে। তবুও আপনার ইনপুট জন্য ধন্যবাদ!
কেভিন এইচ

4

তবুও অন্য উত্তর, কারণ সমাধানগুলির কোনওোটাই আমার প্রয়োজন অনুসারে কমনীয়তা এবং ক্রস প্ল্যাটফর্মনেস:

স্থানীয় শাখাগুলি মুছে ফেলতে কমান্ড রিমোটে নেই:

for b in $(git for-each-ref --format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' refs/heads); do git branch -d $b; done

এটি gitconfig সঙ্গে সংহত করতে যাতে এটি দিয়ে চালানো যেতে পারে git branch-prune:

সজোরে আঘাত

git config --global alias.branch-prune '!git fetch -p && for b in $(git for-each-ref --format='\''%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)'\'' refs/heads); do git branch -d $b; done'

শক্তির উৎস

git config --global alias.branch-prune '!git fetch -p && for b in $(git for-each-ref --format=''%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)'' refs/heads); do git branch -d $b; done'

(পাওয়ারশেল এবং ব্যাশের জন্য সার্বজনীন কমান্ড সন্ধানে সহায়তা প্রয়োজন)

কেন এই উত্তর সেরা?

  • একটি সম্পূর্ণ সমাধান প্রস্তাব: git branch-pruneআপনার গিট একটি আদেশ যোগ
  • উইন্ডোজ পাওয়ারশেল থেকে দুর্দান্ত কাজ করে
  • কোর ধারণা @ jason.rickman এর বুলেটপ্রুফ পদ্ধতি ব্যবহারgit for-each-ref
  • পার্সিং এবং ফিল্টারিং এর সাথে --filterকোনও বাহ্যিক নির্ভরতার প্রয়োজন নেই with

ব্যাখ্যা:

  • আপনার একটি নতুন عرف যোগ করে ~\.gitconfig। এটি কার্যকর করার পরে আপনি কেবল পারেনgit branch-prune
  • এই ওরফে ভিতরে:
    • --pruneপতাকা সহ শাখাগুলি নিয়ে আসে , যা "দূরবর্তী ট্র্যাকিংয়ের শাখাগুলি আর রিমোটে ছাঁটাই করে না"
    • শাখাগুলির একটি তালিকা পেতে ব্যবহার git for-each-refএবং --filter, [gone](কোনও দূরবর্তী নয়)
    • এই তালিকার মাধ্যমে লুপ হয় এবং শাখাটি নিরাপদে মুছে দেয়

1
আপনাকে ধন্যবাদ, @ জেরি-উ অসীমের এই সমাধানটির দুর্দান্ততার উন্নতি করার জন্য।
হিমুরা

@ জেরি-ওউ এবং গিট কনফিগার কমান্ডের আপনার শেষ সম্পাদনা পাওয়ারশেলের কাজ করে না ((
হিমুরা

1

আমি এই বাশ স্ক্রিপ্ট নিয়ে এসেছি। এটা সবসময় শাখা রাখা develop, qa, master

git-clear() {
  git pull -a > /dev/null

  local branches=$(git branch --merged | grep -v 'develop' | grep -v 'master' | grep -v 'qa' | sed 's/^\s*//')
  branches=(${branches//;/ })

  if [ -z $branches ]; then
    echo 'No branches to delete...'
    return;
  fi

  echo $branches

  echo 'Do you want to delete these merged branches? (y/n)'
  read yn
  case $yn in
      [^Yy]* ) return;;
  esac

  echo 'Deleting...'

  git remote prune origin
  echo $branches | xargs git branch -d
  git branch -vv
}

1

কৌতুকটি করার জন্য আমি একটি ছোট পদ্ধতি ব্যবহার করি, আমি আপনাকে অনুরোধ করি যাতে এটি কয়েক ঘন্টা বাঁচাতে পারে এবং আপনাকে আরও দৃশ্যমানতা দেয়

আপনার .bashrc (ম্যাকোসে .bashprofile) এ নিম্নলিখিত স্নিপেটটি কেবল যুক্ত করুন।

git-cleaner() { git fetch --all --prune && git branch --merged | grep -v -E "\bmaster|preprod|dmz\b" | xargs -n 1 git branch -d ;};
  1. সমস্ত রিমোট আনুন
  2. গিট থেকে কেবল মার্জ করা শাখা পান
  3. এই তালিকা থেকে "সুরক্ষিত / গুরুত্বপূর্ণ" শাখা সরান
  4. বাকিগুলি সরান (উদাঃ, পরিষ্কার এবং মার্জ করা শাখা)

আপনার প্রয়োজনীয়তার সাথে মানিয়ে নিতে আপনাকে গ্রেপ রেজেেক্স সম্পাদনা করতে হবে (এখানে, এটি মাস্টার, প্রিপ্রড এবং ডিএমজেড মোছা থেকে রোধ করে)


git fetch --all --pruneকৌতুকটি করেছে ধন্যবাদ!
লিওন - হ্যান লি

1

এটি আমার পক্ষে কাজ করেছে:

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

ওহ, আমি এটিকে দ্বিগুণ পোস্ট করেছি ... পোস্টগুলি পর্যালোচনা করার সময় কেবল এটি দেখেছি। তবে আপনি সত্যিই সেই লোকটির দিকে ইঙ্গিত করতে পারেন যিনি এই আদেশটিকে নিজের হিসাবে গ্রহণের পরিবর্তে এই আদেশ দিয়েছেন!
দ্বিজা

ফোরামের কাছ থেকে আমি এটি পেয়েছি স্মার্ট হওয়ার চেষ্টা করবেন না কেবল উত্তর নিন বা এটিকে উপেক্ষা করুন
ফরিদ আলমনোউটি

এমনকি আপনি যা করতে পারেন তার চেয়েও ... আপনার সাথে এটি আলোচনা করতে এখানে আসেনি। যেমনটি আপনি বলেছেন ..। আমার মন্তব্যটি নিন বা এটিকে উপেক্ষা করুন;)
দ্বিজা

0

আমি আর কতক্ষণ তা সম্পর্কে নিশ্চিত নই, তবে আমি এখন গিট-আপ ব্যবহার করি, যা এটির যত্ন নেয়।

আমি করি git upএবং এটি নতুন শাখাগুলি ট্র্যাক করতে শুরু করে এবং পুরানোগুলি মুছে দেয়।

কেবল এটি পরিষ্কার করার জন্য, এটি বাইরের বাইরে গিট কমান্ড নয় - https://github.com/aanand/git-up

বিটিডাব্লু এটি নোংরা গাছকেও ছড়িয়ে দেয় এবং ন্যায়বিচারের সাথে পুনর্বাসনের ব্যবস্থা করে git up

আশা করি এটি কারওর জন্য কাজে লাগবে


2
এটি সার্ভারে বিদ্যমান স্থানীয় শাখাগুলি মুছে ফেলছে না।
অ্যাশলে

0

আমি মাছের শেলটির জন্য যে সমাধানটি ব্যবহার করি তা এখানে। পরীক্ষিত Mac OS X 10.11.5, fish 2.3.0এবং git 2.8.3

function git_clean_branches
  set base_branch develop

  # work from our base branch
  git checkout $base_branch

  # remove local tracking branches where the remote branch is gone
  git fetch -p

  # find all local branches that have been merged into the base branch
  # and delete any without a corresponding remote branch
  set local
  for f in (git branch --merged $base_branch | grep -v "\(master\|$base_branch\|\*\)" | awk '/\s*\w*\s*/ {print $1}')
    set local $local $f
  end

  set remote
  for f in (git branch -r | xargs basename)
    set remote $remote $f
  end

  for f in $local
    echo $remote | grep --quiet "\s$f\s"
    if [ $status -gt 0 ]
      git branch -d $f
    end
  end
end

কয়েকটি নোট:

সঠিক সেট করা নিশ্চিত করুন base_branch। এই ক্ষেত্রে আমি developবেস শাখা হিসাবে ব্যবহার , কিন্তু এটি কিছু হতে পারে।

এই ভাগে খুব গুরুত্বপূর্ণ: grep -v "\(master\|$base_branch\|\*\)"। এটি নিশ্চিত করে যে আপনি মাস্টার বা আপনার বেস শাখাটি মুছবেন না।

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

পরীক্ষার একটি সহজ উপায় git branch -d $fসঙ্গে প্রতিস্থাপন করা হয় echo "will delete $f"

আমি মনে করি আমারও যুক্ত করা উচিত: আপনার নিজের ঝুঁকিতে ব্যবহার করুন!


0

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

    import git
    import subprocess
    from git.exc import GitCommandError
    import os

    def delete_merged_branches():
        current_dir = input("Enter repository directory:")
        repo = git.Repo(current_dir)
        git_command = git.Git(current_dir)

        # fetch the remote with prune, this will delete the remote references in local.
        for remote in repo.remotes:
            remote.fetch(prune=True)

        local_branches = [branch.name for branch in repo.branches]
        deleted_branches = []

        # deleted_branches are the branches which are deleted on remote but exists on local.
        for branch in local_branches:
            try:
                remote_name = 'origin/'+ branch
                repo.git.checkout(remote_name)
            except GitCommandError:
            # if the remote reference is not present, it means the branch is deleted on remote.
                deleted_branches.append(branch)

        for branch in deleted_branches:
            print("Deleting branch:"+branch)
            git_command.execute(["git", "branch", "-D",branch])


        # clean up the work flow.
        repo.git.checkout('master')
        repo.git.pull()

    if __name__ == '__main__':
        delete_merged_branches()

আশা করি কেউ এটি দরকারী বলে মনে করেন, আমি যদি কিছু মিস করি তবে মন্তব্যগুলি যুক্ত করুন।


0

আপনি যদি ইনস্টলড zshশেল ব্যবহার করে থাকেন Oh My Zshতবে নিরাপদে এটি করার সহজতম উপায় হ'ল বিল্ট ইন স্ব-সম্পূর্ণরূপে।

প্রথমে আপনি কোন শাখাগুলি মুছতে চান তা নির্ধারণ করুন:

~ git branch --merged

  branch1
  branch2
  branch3
* master

এটি আপনাকে ইতিমধ্যে মার্জ হওয়া শাখাগুলির একটি তালিকা প্রদর্শন করবে

কয়েকটি মুছার পরে আপনি মুছতে চান তারপরে টাইপ করুন:

~ git branch -d 

আপনাকে যা করতে হবে তা হ'ল [ট্যাব] এবং এটি আপনাকে স্থানীয় শাখার একটি তালিকা প্রদর্শন করবে। ট্যাব-সম্পূর্ণ ব্যবহার করুন বা কেবল [ট্যাব] টিপুন এবং আপনি [এন্টার] দিয়ে একটি শাখা নির্বাচন করতে তাদের মাধ্যমে চক্র করতে পারেন।

ট্যাব আপনার শাখাগুলির একটি তালিকা না পাওয়া পর্যন্ত বার বার শাখাগুলি নির্বাচন করুন:

~ git branch -d branch1 branch2 branch3

আপনার শাখাগুলির সংগ্রহ মুছতে এখন কেবল এন্টার টিপুন।

আপনি যদি আপনার টার্মিনালে zsh ব্যবহার না করেন ... এটি এখানে পান।


0

আমি পাইপ ব্যবহার করতে পছন্দ করি কারণ এটি কমান্ডটি পড়া সহজ করে তোলে।

আপনি যদি মাস্টার ব্যতীত সমস্ত শাখা মুছে ফেলতে চান তবে এটি আমার সমাধান।

git branch | grep -v master | xargs -n 1 git branch -D

আপনার মানদণ্ডের সাথে মেলে এমন অন্যান্য শাখা মুছতে, প্রথম এবং দ্বিতীয় ব্লকটি সংশোধন করুন।

git branch --merged | grep feature_name | xargs -n 1 git branch -D

-3

গিট ক্লায়েন্ট ব্যবহার করে আমার জন্য যে সহজ উত্তরটি কাজ করেছে তা এখানে:

আপনার মেশিন থেকে পুরোপুরি ভাণ্ডার মুছুন তারপরে আবার যাচাই করে দেখুন।

ঝুঁকিপূর্ণ স্ক্রিপ্টগুলির সাথে আশেপাশে কোনও শোক নেই।


2
আমি বর্তমানে যে শাখাগুলিতে কাজ করছি সেগুলি সম্পর্কে কী: /
মেলো সোভেল

@ মেলোসভেটেল যদি সেগুলি আপনার রিমোটে থাকে তবে আপনি কেবল সেগুলি আবার টানতে পারেন (আপনার সাম্প্রতিক কাজটি আপনার রিমোটে চাপিয়ে দেওয়ার এবং ধাক্কা দেওয়ার কথা মনে রাখবেন!)
জুয়ান কার্লোস ওস্পিনা গঞ্জালেজ

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