দূরবর্তী ছাড়া সমস্ত স্থানীয় শাখা তালিকাভুক্ত করুন


91

সমস্যা: আমি যে সমস্ত স্থানীয় শাখাগুলি রিমোট না করে সেগুলি মুছে ফেলার একটি উপায় চাই। শাখার নামগুলিকে একটিতে পাইপ করা যথেষ্ট সহজ git branch -D {branch_name}, তবে আমি কীভাবে এই তালিকাটি প্রথম স্থানে পাব?

উদাহরণ স্বরূপ:

আমি রিমোট ছাড়াই একটি নতুন শাখা তৈরি করেছি:

$ git co -b no_upstream

আমি আমার সমস্ত শাখা তালিকাভুক্ত করেছি এবং এখানে কেবল একটি রিমোট রয়েছে

$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master

no_upstreamউত্তর পেতে আমি কমান্ডটি চালাতে পারি ?

আমি চালাতে পারি git rev-parse --abbrev-ref --symbolic-full-name @{u}এবং এটি দেখায় যে এটির কোনও দূরবর্তী নেই:

$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

তবে এটি যেমন একটি ত্রুটি, এটি আমাকে এটি ব্যবহার করতে বা অন্য কমান্ডগুলিতে পাইপ করতে দেয় না। আমি এটিকে শেল স্ক্রিপ্টের মতো হয় git-delete-unbranchedঅথবা এটি একটি অতি সাধারণ মণির মতো তৈরি করতে চাইছিgit-branch-delete-orphans



উত্তর:


103

আমি সম্প্রতি আবিষ্কার করেছি git branch -vvযে git branchকমান্ডটির "খুব ভার্বোজ" সংস্করণ ।

এটি দূরবর্তী শাখাগুলির সাথে শাখাগুলি উপস্থিত থাকলে নিম্নলিখিত বিন্যাসে:

  25-timeout-error-with-many-targets    206a5fa WIP: batch insert
  31-target-suggestions                 f5bdce6 [origin/31-target-suggestions] Create target suggestion for team and list on save
* 54-feedback-link                      b98e97c [origin/54-feedback-link] WIP: Feedback link in mail
  65-digest-double-publish              2de4150 WIP: publishing-state

একবার আপনি এই সুন্দর বিন্যাসিত আউটপুট পরে, এটি মাধ্যমে পাইপ করা cutএবং awkআপনার তালিকা পেতে যতটা সহজ :

git branch -vv | cut -c 3- | awk '$3 !~/\[/ { print $1 }'

নিম্নলিখিত ফলাফলের ফলাফল:

25-timeout-error-with-many-targets
65-digest-double-publish

cutঅংশ মাত্র প্রথম দুই (তত্সহ অক্ষর সরিয়ে তথ্য normalizes *এটি ক্ষণস্থায়ী আগে) আউটপুট থেকে awk

awkঅংশ প্রথম কলামে ছাপে যদি তৃতীয় কলামে কোন বর্গাকার বন্ধনী হয়।

বোনাস: একটি উপনাম তৈরি করুন

আপনার গ্লোবাল .gitconfigফাইলে একটি উপনাম তৈরি করে (বা যে কোনও জায়গায়) চালানো সহজ করুন :

[alias]
  local-branches = !git branch -vv | cut -c 3- | awk '$3 !~/\\[/ { print $1 }'

গুরুত্বপূর্ণ: ব্যাকস্ল্যাশটি উলামে পালাতে হবে অন্যথায় আপনার একটি অবৈধ গিটকনফিগ ফাইল থাকবে।

বোনাস: রিমোট ফিল্টারিং

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

git branch -vv | cut -c 3- | awk '$3 !~/\[origin/ { print $1 }'

WIP:যাইহোক কি ..? এটা কি স্ট্যাশ কমান্ড তৈরি করে না ..?
igrek

@igrek এটি প্রতিশ্রুতি বার্তায় আমি কেবল একটি উপসর্গ ব্যবহার করেছি। গিট নির্দিষ্ট কিছু।
জেরেমি বেকার

যখন আমি করি git branch -vv, এমনকি যদি কোনও দূরবর্তী শাখা উপস্থিত থাকে এবং আমার স্থানীয় শাখার সাথে মেলে, আমি [origin/branch-name]ফলাফলের পাশাপাশি দেখতে পাব না । diffকেবল স্থানীয় কী ছিল তা নির্ধারণ করার জন্য আমার কাছে দুটি শাখার তালিকা ছিল।
রায়টাক

git branch -vv | grep -v origin/আমার জন্য যথেষ্ট
আতঙ্কিত হবেন না

4
এটি কি দূরবর্তী শাখাগুলি চিহ্নিত করা মিস করে না gone?
রিড

36

git branch (কোনও বিকল্প ছাড়াই) কেবল স্থানীয় শাখা তালিকাভুক্ত করে তবে তারা জানেন না যে তারা কোনও দূরবর্তী শাখা ট্র্যাক করছে কিনা।

সাধারণত local স্থানীয় শাখাগুলি একবারে মার্জ হয়ে গেলে master( গিট-সুইপের এই ইস্যুতে দেখা যায়) মুছে ফেলা উচিত :

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

এটি আপনার ইচ্ছা মতো সম্পূর্ণ নয়, তবে এটি একটি শুরু।

সঙ্গে --mergedমাত্র শাখা নামে কমিট মধ্যে মিশে গিয়ে তৈরি (যেমন শাখা যার ডগা করে নামে থেকে পৌঁছানো কমিট হয়) তালিকাভুক্ত করা হবে।


4
স্থানীয় শাখা ছাড়াই দূরবর্তী শাখাগুলি অন্তর্ভুক্ত করতে ব্যবহার করুন git branch -a --merged
একিউম্যানাস

21

আমারও তেমন একটা সমস্যা আছে। আমি মুছে ফেলা দূরবর্তী শাখাগুলি অনুসরণ করে এমন সমস্ত স্থানীয় শাখা মুছে ফেলতে চাই। আমি যে git remote prune originশাখাগুলি যেতে চাই সেগুলি সরাতে এটি অপর্যাপ্ত ছিল finding রিমোটটি মোছার পরে, আমি স্থানীয়টিও দূরে চলে যেতে চাই। আমার জন্য যা কাজ করেছে তা এখানে:

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

এছাড়াও, এফডাব্লুআইডাব্লু, আপনার বিশ্বব্যাপী কনফিগারেশন ফাইলটি প্রায় সর্বদা থাকবে ~/.gitconfig

(ওএস এক্স ফিক্স)

যেমনটি লেখা হয়েছে, এটি xargs -r(ধন্যবাদ, কর্নি ) ব্যবহারের কারণে ওএস এক্সে কাজ করে না ।

-rপ্রতিরোধ করা হয় xargsচালু করা থেকে git branch -dএকটি শাখা নাম, যা একটি ত্রুটির বার্তা "পরিণাম ডেকে আনবে ছাড়া fatal: branch name required"। আপনি যদি ত্রুটি বার্তাকে কিছু মনে করেন না, আপনি কেবলমাত্র -rযুক্তিটি সরাতে পারেন xargsএবং আপনি প্রস্তুত set

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

এখানে এই git configলাইনটি রয়েছে ifne:

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

4
এটিকে কি "গিট কনফিগারেশন - গ্লোবাল ..." কমান্ডে রূপান্তর করা সম্ভব? কোনও নির্দেশনা / কীভাবে উইকি-ফর-ডামি দৃষ্টিকোণ থেকে "আপনার গিট কনফিগারেশন ফাইলগুলি সন্ধান করুন, সম্পাদনা করার জন্য সম্পাদক ব্যবহার করুন এবং এরপরে কমান্ডগুলি চালান" বলার পরিবর্তে সহজেই পাস করা সহজ
কান্নান একনাথ

নোট করুন যে xargs -r
OSX- এ

জানা ভাল. ওএসএক্সের জন্য "শূন্য হলে কোনও রান" বিকল্পটি কী হবে তা আমি জানি না।
কার্ল উইলবার

18

দেরীতে সম্পাদনা:

ভাল হয়

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

জিএনইউ / যে কোনও কিছুতে

for b in `git branch|sed s,..,,`; do
    git config --get branch.$b.remote|sed Q1 && echo git branch -D $b
done

মুষ্টিমেয় শাখাগুলির বেশি হওয়ার সম্ভাবনা থাকলে এবং comm -23এর আউটপুট ব্যবহার করে আরও ভাল উপায় হতে পারে ।git branch|sed|sortgit config -l|sed|sort


4
। @nmr S / Git * চতুর্থাংশ 1 / পরীক্ষা $ (Git কনফিগ --get শাখা $ b.remote | sed কুই | wc--1।) = 1 /
jthill

15

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

git branch -vv | grep -v origin

(যদি আপনার রিমোটটির উত্স ব্যতীত অন্য কোনও নামকরণ করা হয় তবে তার পরিবর্তে)।

এটি এমন সমস্ত শাখার তালিকা তৈরি করবে যা কোনও রিমোট ট্র্যাক করছে না, যা আপনি যা খুঁজছেন তা মনে হচ্ছে।


4
এটি এমন শাখাগুলির তালিকা তৈরি করবে যেগুলি রিমোট থাকত তবে চালিত হলেও আপনি আর পাবেন না git fetch --prune
রুসিনারেঞ্জ

4
আইএমও, এটা ভাল জন্য খুঁজছেন হয় ": সর্বস্বান্ত]" এর পরিবর্তে "উত্স" ফিল্টার আউট
fiorentinoing

4

আমি origin/***: goneশাখা পেতে আমার নিজস্ব গিট কমান্ড সংশ্লেষ করি :

git remote prune origin && git branch -vv | cut -c 3- | grep ': gone]' | awk '{print $1}' | xargs -n1 -r echo git branch -d

git remote prune origin && git branch -vv ভার্বোজ মোডে শাখা মুদ্রণ করবে।

cut -c 3- খুব প্রথম অক্ষর মুছে ফেলা হবে।

grep ': gone]'কেবল চলে যাওয়া প্রত্যন্ত শাখাগুলি মুদ্রণ করবে ।

awk '{print $1}' শাখার নাম মুদ্রণ করবে।

xargs -n1 -r echo git branch -dgit branch -dশাখা অপসারণের জন্য কমান্ডটি মুদ্রণ করবে (-n1 প্রতি সময় একটি কমান্ড পরিচালনা করবে, - অথবা কোনও শাখা উপস্থিত না থাকলে কমান্ড জারি করা এড়াতে)।

ইঙ্গিত: কেবল প্রিন্টের পরিবর্তে কমান্ডগুলি চালানোর জন্য "প্রতিধ্বনি" কমান্ডটি সরিয়ে ফেলুন, গিট দেওয়ার আগে কমান্ডগুলি পরীক্ষা করার জন্য আমি কমান্ডের মধ্যে রেখে দিয়েছি।

ইঙ্গিত 2: ইস্যু করুন git branch -Dযদি এবং কেবল যদি আপনি নিশ্চিত হন যে আপনি নিমজ্জিত শাখাগুলি সরাতে চান


থেকে এই আমি আমার ব্যক্তিগত করেনি Git সর্বস্বান্ত
fiorentinoing

4
এটি এখন পর্যন্ত আমি সবচেয়ে পরিষ্কার সমাধান খুঁজে পেয়েছি, দুর্দান্ত! আমি পড়াশোনার জন্য কখনই সময় ব্যয় করিনি awk, আমি জানতাম না যে আপনি এটি করতে পারেন।
অ্যাডামজেসি

2

এটি কী করছে তা বোঝাতে আমি মন্তব্যগুলির সাথে পাওয়ারশেলে এমন কিছু ব্যবহার করেছি। এটি কী চলছে তা পরিষ্কার করার প্রয়াসে, আমি কোনও সংক্ষিপ্ত পাওয়ারশেল কমান্ড (উপকরণ) ব্যবহার করি নি। এটিকে আপনার কাঙ্ক্ষিত স্তরের গোপনীয়তায় সংকোচনে নির্দ্বিধায় :)

$verboseList = @(git branch -vv)
foreach ($line in $verboseList)
{
    # Get the branch name
    $branch = [regex]::Match($line, "\s(\S+)\s").Captures.Groups[1].Value
    # Check if the line contains text to indicate if the remote is deleted
    $remoteGone = $line.Contains(": gone]")
    # Check if the line does not contain text to indicate it is a tracking branch (i.e., it's local)
    $isLocal = !($line.Contains("[origin/"))
    if ($remoteGone -or $isLocal)
    {
        # Print the branch name
        $branch
    }
}

0

বিদ্যমান কয়েকটি উত্তরের সংমিশ্রণ:

[alias]
        branch-local = !git branch -vv | cut -c 3- | egrep '([0-9a-f]{7} [^[])|(: gone\\])' | sed -E 's/(^.+[0-9a-f]{7} (\\[.+\\])?).*$/\\1/'

যেমন:

$ git branch-local
autogen_autoreconf      fcfb1c6 [github/autogen_autoreconf: gone]
autotools_documentation 72dc477 [github/autotools_documentation: gone]
cray-mpich-messy        2196f4b
epel-sphinx             cfda770
lammps                  07d96a7 [github/lammps: gone]
lark-error              9ab5d6c [github/lark-error: gone]
no-root2                c3894d1
openmpi-cray            69326cf [github/openmpi-cray: gone]
shellcheck-cleanup      40d90ec
travis-python36         cde072e
update_vagrant_default  4f69f47 [github/update_vagrant_default: gone]
web-docs                e73b4a8
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.