git কিভাবে স্থানীয় ট্র্যাকিং শাখা ছিটিয়ে যে দূরবর্তী উপর বিদ্যমান নেই




git hub (21)

উইন্ডোজ ব্যবহারকারীদের জন্য @ শুভেচ্ছা এর উত্তরের একটি অভিযোজন নিম্নলিখিত:

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

আমি POSH-GIT ব্যবহার করি এবং দুর্ভাগ্যক্রমে PS এর for নগ্ন পছন্দ করে না, তাই আমি PruneOrphanBranches.cmd নামে একটি প্লেইন 'ol কমান্ড স্ক্রিপ্ট তৈরি করেছি:

@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" দিয়ে কল করুন তবে যেকোনোভাবে আপনি মুছতে চান।

git remote prune origin আমি দূরবর্তী কোনও স্থানীয় শাখাগুলি সরাতে পারি না।

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

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


Answer #1

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

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

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 সব শাখার একটি verbose আউটপুট পায় ( গিট রেফারেন্স )

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

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

% {git branch -d $_} শাখাটি মুছে ফেলে


Answer #2

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

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


Answer #3

উপরের উত্তরগুলির উপর ভিত্তি করে আমি এই ছোট্ট একটি মাছ ধরার যন্ত্রটি ব্যবহার করছি:

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

Answer #4

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

স্থানীয় শাখাটি এখনো একত্রিত হয়েছে কিনা তাও আমি যত্ন করে নিই, কারণ 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

Answer #5

এটি স্থানীয় শাখাগুলি মুছে ফেলবে যার জন্য রিমোট ট্র্যাকিং শাখাগুলি কেটে ফেলা হয়েছে। (আপনি 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.
    

Answer #6

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

git config --global fetch.prune true

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


Answer #7

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

$ 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>

Answer #8

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d সংস্করণ - git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d 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


Answer #9

মুছে ফেলা শাখার রেফারেন্সগুলি আনতে এবং মুছতে, গিট ব্যাশে এটি ব্যবহার করে দেখুন এবং সরানো স্থানীয় ট্রাঙ্কগুলিকে আটকানো ট্র্যাক করা হয়েছে:

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

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


Answer #10

জিট সাহায্যের মাধ্যমে উপস্থাপিত তথ্যের মধ্যে, এই ছোট আইটেমটি আছে:

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

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

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

প্রথমত, ওপি বলেছে যে তারা "সেই দূরবর্তী শাখাগুলি থেকে যেগুলি তৈরি হয়েছিল [যেগুলি দূরবর্তী স্থানে নেই] সেগুলিও সরানোর" চায়। এই git মধ্যে unambiguously সম্ভব নয়। এখানে একটি উদাহরণ।

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

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


Answer #11

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

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

Answer #12

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

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

ব্যাখ্যা

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

এটি git branch --merged চালানোর জন্য মূল্যবান - এটি git branch --merged দ্বারা আপনি কী আশা করেন তা সরিয়ে ফেলার জন্য শুধুমাত্র এটি নিশ্চিত করার জন্য নিজেই তৈরি করেছেন।

( http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ টিউটরিয়াল- স্প্লেন-আপ -আউটডেড -গ্র্যাঞ্চস-ইন-লোকাল- এবং -remote -repositories/ থেকে পোর্টেড / স্বয়ংক্রিয়)।


Answer #13

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

$ git gui

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


Answer #14

@ Wisbucky এর উত্তরের উপর একটি বৈকল্পিক ব্যবহার করে, আমি আমার ~/.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 স্থানীয় এবং দূরবর্তী শাখা উভয় git pruneitgood হবে যা আর মার্জ পরে প্রয়োজন হয়।


Answer #15

মাস্টারের সাথে আপ টু ডেট না যে কোন শাখা মুছে দিন

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

Answer #16

দূরবর্তী শাখাটি মুছে ফেলা হয়েছে ( gone ), যেখানে একটি দূরবর্তী শাখার ট্র্যাকিং করা হয় এমন সমস্ত স্থানীয় শাখাগুলি পরিস্কার করে এমন কিছু চেয়েছিলেন। আমি এমন স্থানীয় শাখা মুছে ফেলতে চাইনি যা কোনও দূরবর্তী শাখার ট্র্যাক করার জন্য সেট আপ করা হয়নি (অর্থাত: আমার স্থানীয় ডেভ শাখা)। এছাড়াও, আমি একটি সহজ এক-মাছ ধরার নৌকা চেয়েছিলেন যা কাস্টম স্ক্রিপ্টগুলি লেখার পরিবর্তে git বা অন্যান্য সাধারণ CLI সরঞ্জামগুলি ব্যবহার করে। আমি এই সহজ কমান্ডটি তৈরি করার জন্য grep এবং বিট ব্যবহার করে শেষ হয়ে গেছি, তারপর এটি আমার ~/.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 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'

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


Answer #17

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

$ git remote prune origin --dry-run

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

$ git remote prune origin

Answer #18

Schleis 'variant আমার জন্য কাজ করে না (উবুন্টু 12.04), তাই আমাকে আমার (স্পষ্ট এবং চকচকে :) বৈকল্পিক প্রস্তাব:

বৈকল্পিক 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

Answer #19

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

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

আরো তথ্য


Answer #20

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

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

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

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





git