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


98

আমি আউটপুটে তালিকাভুক্ত সমস্ত শাখা মুছতে চাই ...

$ git branch

... তবে বর্তমান শাখা রাখা, একধাপে । এটা কি সম্ভব? যদি তাই হয়, কিভাবে?




উত্তর:


67

@ পঙ্কিজের উত্তরের ভিত্তিতে আমি দুটি গিট এলিয়াস তৈরি করেছি:

[alias]
    # Delete all local branches but master and the current one, only if they are fully merged with master.
    br-delete-useless = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
    }; f"
    # Delete all local branches but master and the current one.
    br-delete-useless-force = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
    }; f"

যোগ করা হবে ~/.gitconfig


এবং, যেমনটি টোরিক উল্লেখ করেছেন:

নোট করুন যে ছোট হাতের অক্ষর -dএকটি "সম্পূর্ণরূপে মার্জড" শাখা মুছে ফেলবে না (ডকুমেন্টেশন দেখুন)। ব্যবহারের ফলে এই -D জাতীয় শাখাগুলি মুছে ফেলা হবে , এমনকি যদি এটি "হারিয়ে যাওয়া" হওয়ার অঙ্গীকার করে; এটিকে খুব যত্ন সহকারে ব্যবহার করুন , কারণ এটি শাখাটিও পুনর্বিবেচনাগুলি মুছে দেয়, যাতে স্বাভাবিক "দুর্ঘটনাজনিত মোছা থেকে পুনরুদ্ধার" স্টাফ কাজ করে না।

মূলত, -forceসংস্করণটি কখনই ব্যবহার করবেন না যদি আপনি 300% নিশ্চিত না হন যে আপনি গুরুত্বপূর্ণ কিছু হারাবেন না। কারণ এটি চিরতরে হারিয়ে গেছে


4
মুছে ফেলা শাখায় প্রতিশ্রুতিবদ্ধ হওয়া কিছুক্ষণের জন্য রিফ্লগে থাকা উচিত।
ক্যাপ্ট্রেসপেক্ট

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

4
@ ভাদোরোয়েস্ট আপনি একটি নির্দিষ্ট প্রতিশ্রুতি git branch branchname commitid
দেখিয়ে

@ পিকিউনেট আমি জানতাম না যে এই শাখার জন্য সমস্ত ইতিহাস পুনরায় তৈরি করবে, ধন্যবাদ, জানা ভাল!
ভাদোরকোয়েস্ট

4
@ ভ্যাডোরকোয়েস্ট যেহেতু কমিটমেন্ট অবজেক্টগুলি অপরিবর্তনীয় (এবং হ্যাশ হিসাবে সূচিত), প্রতিটি সম্পাদনের জন্য একটি নতুন অবজেক্ট তৈরি করতে হবে (একটি ভিন্ন হ্যাশ সহ)
pqnet

190
$ git branch | grep -v "master" | xargs git branch -D 

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


31
আপনি যদি বর্তমান শাখা ব্যবহার রাখতে চান grep -v ^*
শোবার্ন

4
অনেক উত্স আমাকে এই স্ক্রিপ্টটি দেখায়, তবে আমি যখন এটি চালাই তখন সবসময় আমাকে বলে যে শাখাগুলি পাওয়া যায় নি :(
tucq88

4
এটি সঠিক নয়, এটি নামক কোনও শাখা মুছে ফেলবে না master-copy, উদাহরণস্বরূপ
mvallebr

4
ততক্ষণে প্রয়োজন হিসাবে পুনরায় কৌতুক করুন, উদাহরণস্বরূপgrep -v "^ *master$"
ব্র্যাড কোচ

9
রাখতে চাইলে দুটি শাখা ব্যবহার করুন grep -v "master\|my-other-branch"
ডেরেক সোইক

23

প্রথম (শাখা রাখতে> চান সুইচ প্রাক্তন : মাস্টার ):

git checkout master

দ্বিতীয় ( নিশ্চিত হন যে আপনি মাস্টার আছেন )

git branch -D $(git branch)

4
খুব দ্রুত এবং সহজ কেন এটি উপবিষ্ট হচ্ছে না?
প্রিন্সবিলিজিকে

4
এটি আমার কাছে সবচেয়ে সহজ এবং সর্বোত্তম উত্তর।
সালেহ এনাম শোহাগ

4
আপনি যদি পাওয়ারশেল ব্যবহার করেন তবে ব্যবহার করুন git branch -D $(git branch).Trim()
নাটোরোরাম

আমাদের কি $(git branch)উদ্ধৃতি দেওয়ার কথা ? এটি কাজ করে না: ত্রুটি: শাখা '$ (গিট' পাওয়া যায় নি error ত্রুটি: শাখা 'শাখা)' পাওয়া যায় নি।
saran3h

4
প্রচুর উত্তম উত্তরের উত্তরটি
উত্সাহিত করা

13

git branch -d(বা -D) একাধিক শাখার নামকে অনুমতি দেয় তবে কমপক্ষে কিছুটা কোড না লিখে "স্বয়ং যে সমস্ত স্থানীয় শাখা এখন আমি আছি সেগুলি বাদ দিয়ে" স্বয়ংক্রিয়ভাবে সরবরাহ করা কিছুটা জটিল।

"সেরা" (আনুষ্ঠানিকভাবে সঠিক) পদ্ধতিটি git for-each-refশাখার নামগুলি পেতে ব্যবহার করা হয়:

git for-each-ref --format '%(refname:short)' refs/heads

তবে আপনি কোন শাখায় git symbolic-ref HEADরয়েছেন তা নির্ধারণ করা আরও শক্ত ( যদি আপনি অভিনব স্ক্রিপ্ট লিখতে চান তবে এটির জন্য "আনুষ্ঠানিকভাবে সঠিক" পদ্ধতি)।

আরও সুবিধামতভাবে, আপনি ব্যবহার করতে পারেন git branch, যা দুটি স্থানীয় স্থানের পূর্বে আপনার স্থানীয় শাখার নামগুলি বা (বর্তমান শাখার জন্য) একটি তারকাচিহ্ন দ্বারা প্রিন্ট করে *। সুতরাং, *সংস্করণটি মুছে ফেলার জন্য এটির মাধ্যমে চালান এবং আপনার স্পেস-বিভাজিত শাখার নামগুলি রেখে গেছে যা আপনি এর পরে প্রেরণ করতে পারবেন git branch -d:

git branch -d $(git branch | grep -v '^*')

বা:

git branch | grep -v '^*' | xargs git branch -d

নোট করুন যে ছোট হাতের অক্ষর -dএকটি "সম্পূর্ণরূপে মার্জড" শাখা মুছে ফেলবে না (ডকুমেন্টেশন দেখুন)। ব্যবহারের -Dফলে এই জাতীয় শাখাগুলি মুছে ফেলা হবে, এমনকি যদি এটি "হারিয়ে যাওয়া" হওয়ার অঙ্গীকার করে; এটিকে খুব যত্ন সহকারে ব্যবহার করুন, কারণ এটি শাখাটিও পুনর্বিবেচনাগুলি মুছে দেয়, যাতে স্বাভাবিক "দুর্ঘটনাজনিত মোছা থেকে পুনরুদ্ধার" স্টাফ কাজ করে না।


এটি হওয়া উচিত git branch -D $(git branch | grep -v '^*'), যদি আপনি সেই শাখাগুলি মুছতে চান যা মার্জ হয়েছে।
প্রতীক সিংহল

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

12

সমস্ত মার্জ করা শাখা সরানোর জন্য (বর্তমান ব্যতীত -v ‘*’):

git branch --merged | grep -v '*' | xargs git branch -D

রেপো সম্পূর্ণ ক্লিন আপের জন্যও আমি এই জাতীয় আদেশ দিয়েছি:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

এখান থেকে নেওয়া ।


4
এটি কেবল সংযুক্ত শাখাগুলি মুছে দেয়।
প্রতীক সিংহল

10

নির্দিষ্ট শাখা বাদে সমস্ত শাখা মুছুন :

git branch | grep -v "branch name" | xargs git branch -D

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

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


3

আমি একবার আমার উইন্ডোজ পরিবেশের জন্য এই কনস্ট্রাক্টটি তৈরি করেছি। হতে পারে এটি অন্য কাউকে সাহায্য করবে। কার্যকর করার সময়, মাস্টার এবং বর্তমান শাখা মুছে ফেলা হয় না । অন্য সমস্ত মার্জ করা শাখা নির্বিশেষে মুছে ফেলা হবে।

@echo off
cd PATH_TO_YOUR_REPO

REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%

REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
    endlocal
)

REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
    git branch -D %%a
)

REM -- remove temp-file with branch information inside
DEL %textFile%

REM -- show local branches after the cleaning
echo Local branches:
git branch

pause 
exit

3

এক ধাপে বর্তমান শাখা বাদে সমস্ত শাখা মুছতে:

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D


2

স্থানীয়ভাবে সমস্ত মার্জ করা শাখা মুছুন:

git branch -D `git branch --merged | grep -v \* | xargs`

নির্দিষ্ট শাখা বাদে সমস্ত শাখা মুছুন :

git branch | grep -v "branch name" | xargs git branch -D

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

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

2

ধরে নেওয়া git branchবর্তমান শাখাটিকে উপসর্গযুক্ত দেখায় *; PowerShell নিম্নলিখিত এক মাছ ধরার নৌকা ব্যবহারের মাধ্যমে সমস্ত শাখা যে সঙ্গে না শুরু মুছে ফেলবে *

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = যেখানে-অবজেক্ট

% = ফরচ-অবজেক্ট


1

সুতরাং আমি এখানে প্রচুর কঠোর কোডেড শাখার নাম দেখতে পাচ্ছি ... এবং আমি মনে করি যে এখানে আমার উত্তরটি প্রশ্নের উত্তর "বর্তমান শাখা" এর সাথে আরও সঠিক, যখন এটি একক রেখায় রাখে এবং আমার মতো নতুনদের বাশ দেওয়ার জন্য পাঠযোগ্য। ঠিক যেখানে creditণ দেওয়ার জন্য, উত্তরটি অবশ্যই @ পঙ্কিজের উত্তরের উপর ভিত্তি করে রয়েছে।

git branch | grep -v $(git branch --show-current) | xargs git branch -d

এবং আমি এটি আমার .বাশ_আলিয়াসে ডেবিয়ান পাশাপাশি একটি লাইনে আলাদা করে রেখেছি।

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(যদিও আমি মনে করি কিছু কমান্ড লাইনে সাব কমান্ড চালানোর জন্য কিছু ব্যাশ বৈশিষ্ট্য সক্ষম করা দরকার)


1

আমি এটি ব্যবহার করি কারণ আমি যা মুছতে চাই না তাতে আমি আরও বেশি নির্বাচনী হতে পারি। এই নীচের কমান্ডটি মাস্টার, বিকাশ এবং বর্তমান শাখা ব্যতীত প্রতিটি শাখা অপসারণ করে।

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

সুতরাং আমি এটি আমার মধ্যে রাখা ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches

0

আইএমএইচও, স্থানীয় শাখা অপসারণের নিরাপদতম উপায়:

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

এছাড়াও, এই বিষয় সম্পর্কিত আরও তথ্য আপনি সমস্ত স্থানীয় গিট শাখা মুছতে পারেন


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