रिमोट के बिना सभी स्थानीय शाखाओं की सूची बनाएं


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भाग सिर्फ पहले दो (सहित पात्रों को हटाने के द्वारा डेटा को सामान्य *इसे करने के लिए पारित करने से पहले) उत्पादन से awk

awkतीसरे कॉलम में कोई वर्ग ब्रैकेट नहीं होने पर यह भाग पहले कॉलम को प्रिंट करता है।

बोनस: एक उपनाम बनाएँ

अपनी वैश्विक .gitconfigफ़ाइल (या जहाँ भी) में एक उपनाम बनाकर इसे चलाना आसान बनाएं :

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

महत्वपूर्ण: बैकस्लैश को उर्फ ​​में भाग जाने की आवश्यकता है अन्यथा आपके पास एक अमान्य गिटकॉन्फ़ फ़ाइल होगी।

बोनस: रिमोट फ़िल्टरिंग

यदि किसी कारण से आपके पास विभिन्न शाखाओं के लिए कई ट्रैकिंग रिमोट हैं, तो यह निर्दिष्ट करना काफी आसान है कि आप किस रिमोट को चेक करना चाहते हैं। बस दूरस्थ नाम को awk पैटर्न में जोड़ें। मेरे मामले में, ऐसा है originतो मैं यह कर सकता हूं:

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

WIP:वैसे भी क्या ..? नहीं है कि क्या एक छिपाने की जगह आदेश बनाता है ..?
इग्रेक

@igrek यह एक उपसर्ग है जो मैंने प्रतिबद्ध संदेश में उपयोग किया है। कुछ भी नहीं विशिष्ट करने के लिए।
जेरेमी बेकर

जब मैं करता हूं git branch -vv, भले ही एक दूरस्थ शाखा मौजूद हो और मेरी स्थानीय शाखा से मेल खाती हो, तो मैं [origin/branch-name]परिणाम के साथ नहीं देखूंगा । मुझे diffशाखाओं की दो सूचियों को वास्तव में यह पता लगाना था कि केवल स्थानीय क्या था।
रियांकूट

git branch -vv | grep -v origin/मेरे लिए पर्याप्त है
घबराओ मत

2
क्या यह चिह्नित दूरस्थ शाखाओं को याद नहीं करता है gone?
रीड

36

git branch (बिना किसी विकल्प के) केवल स्थानीय शाखाओं को सूचीबद्ध करता है, लेकिन आपको पता नहीं है कि वे किसी दूरस्थ शाखा को ट्रैक कर रहे हैं या नहीं।

आमतौर पर उन स्थानीय शाखाओं को एक बार मर्ज कर दिया जाना चाहिए master(जैसा कि इस मुद्दे को गिट-स्वीप में देखा गया है ):

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

यह उतना नहीं है जितना आप चाहते हैं, लेकिन यह एक शुरुआत है।

इसके साथ --merged, केवल नामित कमेटी में विलय की गई शाखाएं (यानी जिनकी शाखाएं नामांकित कमिट से पहुंच योग्य हैं) को सूचीबद्ध किया जाएगा।


1
स्थानीय शाखा के बिना दूरस्थ शाखाओं को भी शामिल करना, उपयोग करना git branch -a --merged
एक्यूमेनस

21

मेरा भी वही मुद्दा है। मैं उन सभी स्थानीय शाखाओं को हटाना चाहता हूं जो अब हटा दी गई दूरस्थ शाखाओं को ट्रैक कर रही थीं। मैं पा रहा हूँ git remote prune originकि मैं चाहता हूँ कि शाखाओं को हटाने के लिए अपर्याप्त था। एक बार रिमोट डिलीट हो जाने के बाद, मैं चाहता हूं कि लोकल भी चले जाएं। यहाँ मेरे लिए क्या काम किया गया है:

मेरे से ~/.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अपने वास्तविक विन्यास में, क्योंकि मैं Git मर्ज ना किए गए शाखाओं के बारे में शिकायत सुनने के लिए नहीं करना चाहती। आप इस कार्यक्षमता को भी चाह सकते हैं। यदि हां, तो बस का उपयोग -Dकरने के बजाय -dकि आदेश के अंत में।

इसके अलावा, FWIW, आपकी वैश्विक कॉन्फ़िगरेशन फ़ाइल लगभग हमेशा होगी ~/.gitconfig

(ओएस एक्स फिक्स)

जैसा कि लिखा गया है, यह xargs -r(धन्यवाद, कोर्न ) के उपयोग के कारण ओएस एक्स पर काम नहीं करता है ।

-rरोकने के लिए है xargsचलने से git branch -dएक शाखा का नाम, जो एक त्रुटि संदेश "में परिणाम होगा बिना fatal: branch name required"। यदि आपको त्रुटि संदेश बुरा नहीं लगता है, तो आप केवल -rतर्क को हटा सकते हैं xargsऔर आप सभी सेट कर सकते हैं।

हालाँकि, यदि आप एक त्रुटि संदेश नहीं देखना चाहते हैं (और वास्तव में, जो आपको दोषी ठहरा सकते हैं) तो आपको एक और चीज़ की आवश्यकता होगी जो एक खाली पाइप के लिए जाँच करता है। यदि आप moreutils से 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'

1
क्या इसे "git config --global ..." कमांड में बदलना संभव है? एक निर्देश से / कैसे-कैसे-विकी के लिए-डमीज बिंदु से यह कहने के बजाय पास करना आसान है "अपनी git config फ़ाइलों का पता लगाएं, इसे संपादित करने के लिए संपादक का उपयोग करें, फिर कमांड चलाएं"
कन्नन एकनाथ

ध्यान दें कि xargs -r OSX
Korny

जानकार अच्छा लगा। मुझे नहीं पता कि 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|sortऔर git config -l|sed|sort


1
@nmr s / git। * Q1 / test $ (git config --get branch। $ b.remote। sed q | wc -1) = 1 /
jthill

15

यह मेरे लिए काम करता है:

git branch -vv | grep -v origin

(यदि आपके रिमोट का नाम मूल के अलावा कुछ भी रखा गया है, तो विकल्प)।

यह उन सभी शाखाओं को सूचीबद्ध करेगा जो रिमोट को ट्रैक नहीं कर रही हैं, जो आपको लगता है कि आप क्या देख रहे हैं।


2
यह उन शाखाओं को सूचीबद्ध करेगा जिनके पास एक रिमोट हुआ करता था, लेकिन अब भी आप नहीं चलाते हैं git fetch --prune
रुसिनारेंज

2
IMO, "मूल" को छानने के बजाय ": गया]"
fiorentinoing

4

मैं origin/***: goneशाखाओं को प्राप्त करने के लिए अपने स्वयं के Git कमांड को वर्गीकृत करता हूं :

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 प्रति समय एक कमांड का प्रबंधन करेगा, -एर कमांड जारी करने से बचने के लिए यदि कोई शाखा मौजूद नहीं है)।

HINT: केवल प्रिंट के बजाय कमांड चलाने के लिए "इको" कमांड को हटा दें , मैंने इसे git को जारी करने से पहले कमांड को जांचने के लिए कमांड में छोड़ दिया।

HINT 2: मुद्दा git branch -Dयदि और केवल यदि आप सुनिश्चित हैं कि आप अनमैरिड शाखाओं को हटाना चाहते हैं


से मैं अपने निजी किया Git चला गया
fiorentinoing

1
यह अब तक मुझे मिला सबसे अच्छा समाधान है, अच्छा है! मैंने अध्ययन करने में कभी समय awkनहीं लगाया, मुझे नहीं पता था कि आप ऐसा कर सकते थे।
adjjc

2

यहाँ कुछ है जो मैंने PowerShell में टिप्पणियों के साथ उपयोग किया है ताकि यह समझा जा सके कि यह क्या कर रहा है यह स्पष्ट करने के प्रयास में कि क्या चल रहा है, मैंने किसी भी संक्षिप्त पावरस्ले कमांड (उपनाम) का उपयोग नहीं किया है। बेझिझक इसे अपने इच्छित स्तर पर संक्षिप्त करें :)

$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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.