26 पॉइंट द्वारा GN⁺ 2026-02-21 | 4 टिप्पणियां | WhatsApp पर शेयर करें
  • लंबे समय से चली आ रही Git branch साफ़ करने की समस्या को हल करने के लिए एक सरल कमांड CIA के आंतरिक डेवलपमेंट दस्तावेज़ में मिला
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
  • यह कमांड git branch --merged के नतीजों में से मौजूदा branch और master को छोड़कर merged branches को एक साथ delete कर देता है
  • आधुनिक प्रोजेक्ट्स के लिए main और develop branch को छोड़ने वाला संशोधित वर्ज़न भी है
  • इसे Git alias के रूप में रजिस्टर करके बार-बार होने वाले काम को ऑटोमेट किया जा सकता है, और यह सरल होने के बावजूद लगातार work efficiency बढ़ाने और repository को साफ़ रखने के लिए उपयोगी टूल है

Vault7 में मिला Git टिप

  • 2017 में WikiLeaks द्वारा जारी किए गए Vault7 दस्तावेज़ों में CIA के hacking tools और आंतरिक डेवलपमेंट दस्तावेज़ शामिल थे
    • इनमें एक पेज Git tips और tricks के संग्रह का था, जिसमें ज़्यादातर सामान्य commit संशोधन, stash, और bisect के इस्तेमाल जैसे विषय थे
  • उसी दस्तावेज़ में मिला यह one-liner कमांड आज तक मेरे ~/.zshrc में बना हुआ है

पुरानी branches साफ़ करने की समस्या

  • लोकल Git repository में समय के साथ merged branches जमा होती जाती हैं, जिससे उन्हें व्यवस्थित रखना मुश्किल हो जाता है
    • feature branch, hotfix, और experiment branch merge होने के बाद भी रह जाती हैं, जिससे git branch की सूची उलझी हुई हो जाती है
  • git branch --merged कमांड से merged branches देखी जा सकती हैं, लेकिन मैन्युअल delete करना झंझट भरा है

CIA दस्तावेज़ का मूल कमांड

  • दिया गया मूल कमांड यह है
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d  
    
  • इसके हिस्सों का विवरण
    • git branch --merged: मौजूदा branch में merge हो चुकी सभी लोकल branches की सूची दिखाता है
    • grep -v "\*\|master": मौजूदा branch (*) और master को छोड़ता है
    • xargs -n 1 git branch -d: बाकी branches को एक-एक करके सुरक्षित रूप से delete करता है (-d unmerged branches को delete नहीं करता)

कमांड का आधुनिक वर्ज़न

  • क्योंकि ज़्यादातर प्रोजेक्ट अब main branch का उपयोग करते हैं, कमांड को इस तरह बदला जा सकता है
    git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d  
    
  • deployment के बाद main branch पर इसे चलाने से दर्जनों branches घटकर कुछ ही रह जाती हैं
  • इस कमांड को Git alias के रूप में रजिस्टर करके आसानी से चलाया जा सकता है
    alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'  
    
    • इसके बाद repository में सिर्फ ciaclean कमांड चलाने पर ऑटोमैटिक सफ़ाई हो जाएगी

efficiency और practicality

  • यह कमांड हर हफ्ते कुछ मिनट बचाने और branch सूची को साफ़-सुथरा बनाए रखने में मदद करता है
  • इसे एक सरल लेकिन लगातार productivity बढ़ाने वाला व्यावहारिक टूल माना गया है

4 टिप्पणियां

 
youngminz 2026-02-21

मैं भी git gone नाम का alias लगाकर इस्तेमाल कर रहा हूँ। बहुत सुविधाजनक है
- alias.gone = ! git fetch -p && git for-each-ref --format '%(refname:short) %(upstream:track)' | awk '$2 == "[gone]" {print $1}' | xargs -r git branch -D

 
foriequal0 2026-02-21

HN टिप्पणियों में कोई कह रहा है कि वह मेरे बनाए हुए प्रोग्राम का इस्तेमाल करता है।

I use git-trim for that:
https://github.com/foriequal0/git-trim
Readme में यह भी समझाया गया है कि कुछ मामलों में यह bash-oneliner से बेहतर क्यों है।
https://news.ycombinator.com/item?id=47089533

 
a1eng0 2026-02-21

मैं pure git नहीं इस्तेमाल करता, लेकिन gh-poi नाम के टूल से सफाई कर रहा हूँ.

https://github.com/seachicken/gh-poi

 
GN⁺ 2026-02-21
Hacker News की राय
  • मैं ब्रांच साफ़ करने के लिए git tidy alias इस्तेमाल करता हूँ
    यह default ब्रांच(main, master) को delete नहीं करता, और current ब्रांच या किसी दूसरे worktree की ब्रांच को भी नहीं छूता
    remote से गायब हो चुकी ब्रांचें भी अपने-आप delete हो जाती हैं, और कोड मेरी dotfiles settings में है

    • init.defaultBranch का इस्तेमाल करना risky है। हर repository का default ब्रांच नाम अलग हो सकता है, और यह setting global होती है, इसलिए इसे पहले से तय करना पड़ता है
      मैंने git default नाम का alias बनाया है ताकि remote(origin) से असली default ब्रांच अपने-आप पता चल जाए
    • यह script सच में useful है, इसलिए इसे git extras में contribute करना अच्छा होगा
  • मैं fzf के साथ integrated cleanup command इस्तेमाल करता हूँ
    merged ब्रांचों को पहले चुनकर एक साथ delete किया जा सकता है, और चाहें तो कुछ को छोड़ भी सकते हैं
    यह remote ब्रांचों को भी साथ में साफ़ करता है, और कोड मेरी .gitconfig settings में है
    साथ ही user.primaryBranch variable से हर repository के लिए अलग default ब्रांच सेट करता हूँ

    • मुझे लगता है init.defaultBranch की जगह वह भी ठीक रहेगा। पहले से initialized repository में भी git config --local init.defaultBranch main सेट करने पर यह काम करता है
    • ब्रांच switch किए बिना भी दूसरी ब्रांच से pull किया जा सकता है। उदाहरण के लिए git pull origin main:main के बाद git rebase main किया जा सकता है
  • git branch --merged उन repositories में ठीक से काम नहीं करता जो squash merge इस्तेमाल करती हैं
    क्योंकि squash किए गए commit का SHA, original ब्रांच के HEAD से अलग होता है
    मैं जानना चाहता हूँ कि squashed ब्रांचों को safely detect करने का कोई tool है क्या

    • मैंने हाल ही में script बदलकर यह किया है कि “पिछले 30 दिनों में कोई commit नहीं” + “remote पर ब्रांच नहीं” शर्त होने पर delete हो
      यह perfect नहीं है, लेकिन काफ़ी practical है, और delete करने से पहले हमेशा confirmation prompt दिखाता है
      GitHub की automatic branch deletion setting को देखा था
    • सिर्फ squash merge ही नहीं, rebase merge भी detect नहीं होता
      ज़्यादातर लोग remote branch deletion event पर hook लगाकर इसे handle करते हैं
    • मैं तो बस remote ब्रांच गायब होने पर local ब्रांच delete कर देता हूँ
      git gone नाम का alias इस्तेमाल करता हूँ, जो git fetch -p के बाद [gone] status वाली ब्रांचों को साफ़ करता है
    • मैं Gerrit इस्तेमाल करने वाले environment में हूँ, इसलिए server पर rebase होता है
      इसलिए git branch --merged, git cherry, और git log grep इन तीन तरीकों को मिलाकर script इस्तेमाल करता हूँ
      लेकिन अगर commit amend किया गया हो या कई commits हों, तो false positive आ सकते हैं
    • अगर पहले ब्रांच पर rebase आज़माया जाए, तो शायद empty branch detect की जा सकती है
  • मैं git lint alias से merged ब्रांचें साफ़ करता हूँ
    main, master, stable ब्रांचों को छोड़कर delete करता हूँ, और अक्सर git pull --prune && git lint का combination इस्तेमाल करता हूँ

  • Git command खुद तो साधारण है, लेकिन क्लिक करते-करते Wikileaks source का document देखना दिलचस्प लगा
    CIA का “Fine Dining” project ऐसा tool था जो USB में छिपे malware को app की तरह disguise करता था

    • वह तो ज़्यादा एक सामान्य जासूसी तकनीक जैसी लगती है। असली ‘पागलपन’ तो MKULTRA जैसे experiments थे, जहाँ लोगों को चुपके से LSD दिया जाता था
  • असली समस्या तो सिर्फ unmerged branches की list output करने वाले हिस्से से भी हल हो सकती थी

  • यह अजीब है कि इतना natural काम कई lines के bash की माँग करता है
    Git का codebase इतना बड़ा है, फिर भी यह built-in feature के रूप में नहीं मिलता, यह थोड़ा अफ़सोसजनक है
    संबंधित blog post भी देखी जा सकती है

    • लेकिन xargs या for loop थोड़ा-सा सीख लिया जाए, तो यह बहुत छोटी बात है
      इसे built-in command बनाने के लिए कई तरह के edge cases संभालने पड़ेंगे, जिससे यह उल्टा और complex हो सकता है
    • “code lines” के आधार पर ऐसी चीज़ों को judge करना अजीब पैमाना लगता है
  • आख़िर में “लगता है किसी ने अभी-अभी xargs सीखा है” जैसी प्रतिक्रिया भी आई

    • ऐसा रवैया gatekeeping जैसा लगता है। नई सीखी चीज़ share करना अच्छी बात है
      मैंने भी पहले blog posts और लेखों से ऐसी चीज़ें सीखी थीं
    • लेकिन यह कि उसने यह CIA document से सीखा, यह भी एक पीढ़ीगत तस्वीर जैसा है। आजकल सीखना स्कूल से ज़्यादा इंटरनेट पर होता है
    • नकारात्मक प्रतिक्रियाएँ थीं, फिर भी ऐसे utility combinations ही CLI का असली मज़ा हैं
    • source CIA हो या कुछ भी, अगर किसी ने xargs नया सीखा है, तो वह अपने-आप में अच्छी बात है
    • Bell Labs पीढ़ी के नज़रिए से यह बहुत बुनियादी बात लग सकती है
  • मैं आजकल TUI का आदी हूँ। कुछ भी असुविधाजनक लगे तो Claude-code से TUI बनवाने को कह देता हूँ
    मैंने Textual library का इस्तेमाल करके Git worktree manage करने के लिए एक TUI बनाया, और Claude Python code काफ़ी अच्छा संभाल लेता है

    • tig नाम का पुराना Git TUI भी recommend किया गया। inspiration लेने के लिए भी अच्छा है
    • कुछ लोगों ने चिंता जताई कि Claude का लिखा code कहीं Git repository खराब न कर दे
    • कुछ लोग यह भी नहीं जानते थे कि TUI क्या होता है
    • Git के लिए TUI चाहिए तो Magit ज़ोरदार recommendation है। सीखने में भी मदद मिलती है
      Magit की rebase feature पर यह लेख भी देखने लायक है
    • मेरे पास भी Claude से बने कई छोटे tools हैं। जिज्ञासा है कि क्या इन्हें open source किया गया है
  • मैंने भी Fish shell में कुछ ऐसा ही बनाया है
    यह fzf से remote पर गायब हुई ब्रांचें चुनकर delete करने वाला function है
    मेरे dotfiles code में है