- लंबे समय से चली आ रही Git branch साफ़ करने की समस्या को हल करने के लिए एक सरल कमांड CIA के आंतरिक डेवलपमेंट दस्तावेज़ में मिला
git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d - यह कमांड
git branch --mergedके नतीजों में से मौजूदा branch और master को छोड़कर merged branches को एक साथ delete कर देता है - आधुनिक प्रोजेक्ट्स के लिए
mainऔरdevelopbranch को छोड़ने वाला संशोधित वर्ज़न भी है - इसे 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की सूची उलझी हुई हो जाती है
- feature branch, hotfix, और experiment branch merge होने के बाद भी रह जाती हैं, जिससे
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 करता है (-dunmerged branches को delete नहीं करता)
कमांड का आधुनिक वर्ज़न
- क्योंकि ज़्यादातर प्रोजेक्ट अब
mainbranch का उपयोग करते हैं, कमांड को इस तरह बदला जा सकता हैgit branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d - deployment के बाद
mainbranch पर इसे चलाने से दर्जनों branches घटकर कुछ ही रह जाती हैं - इस कमांड को Git alias के रूप में रजिस्टर करके आसानी से चलाया जा सकता है
alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'- इसके बाद repository में सिर्फ
ciacleanकमांड चलाने पर ऑटोमैटिक सफ़ाई हो जाएगी
- इसके बाद repository में सिर्फ
efficiency और practicality
- यह कमांड हर हफ्ते कुछ मिनट बचाने और branch सूची को साफ़-सुथरा बनाए रखने में मदद करता है
- इसे एक सरल लेकिन लगातार productivity बढ़ाने वाला व्यावहारिक टूल माना गया है
4 टिप्पणियां
मैं भी
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
HN टिप्पणियों में कोई कह रहा है कि वह मेरे बनाए हुए प्रोग्राम का इस्तेमाल करता है।
मैं pure git नहीं इस्तेमाल करता, लेकिन
gh-poiनाम के टूल से सफाई कर रहा हूँ.https://github.com/seachicken/gh-poi
Hacker News की राय
मैं ब्रांच साफ़ करने के लिए
git tidyalias इस्तेमाल करता हूँयह default ब्रांच(main, master) को delete नहीं करता, और current ब्रांच या किसी दूसरे worktree की ब्रांच को भी नहीं छूता
remote से गायब हो चुकी ब्रांचें भी अपने-आप delete हो जाती हैं, और कोड मेरी dotfiles settings में है
init.defaultBranchका इस्तेमाल करना risky है। हर repository का default ब्रांच नाम अलग हो सकता है, और यह setting global होती है, इसलिए इसे पहले से तय करना पड़ता हैमैंने
git defaultनाम का alias बनाया है ताकि remote(origin) से असली default ब्रांच अपने-आप पता चल जाएमैं
fzfके साथ integrated cleanup command इस्तेमाल करता हूँmerged ब्रांचों को पहले चुनकर एक साथ delete किया जा सकता है, और चाहें तो कुछ को छोड़ भी सकते हैं
यह remote ब्रांचों को भी साथ में साफ़ करता है, और कोड मेरी .gitconfig settings में है
साथ ही
user.primaryBranchvariable से हर repository के लिए अलग default ब्रांच सेट करता हूँinit.defaultBranchकी जगह वह भी ठीक रहेगा। पहले से initialized repository में भीgit config --local init.defaultBranch mainसेट करने पर यह काम करता हैgit pull origin main:mainके बादgit rebase mainकिया जा सकता हैgit branch --mergedउन repositories में ठीक से काम नहीं करता जो squash merge इस्तेमाल करती हैंक्योंकि squash किए गए commit का SHA, original ब्रांच के HEAD से अलग होता है
मैं जानना चाहता हूँ कि squashed ब्रांचों को safely detect करने का कोई tool है क्या
यह perfect नहीं है, लेकिन काफ़ी practical है, और delete करने से पहले हमेशा confirmation prompt दिखाता है
GitHub की automatic branch deletion setting को देखा था
ज़्यादातर लोग remote branch deletion event पर hook लगाकर इसे handle करते हैं
git goneनाम का alias इस्तेमाल करता हूँ, जोgit fetch -pके बाद[gone]status वाली ब्रांचों को साफ़ करता हैइसलिए
git branch --merged,git cherry, औरgit log grepइन तीन तरीकों को मिलाकर script इस्तेमाल करता हूँलेकिन अगर commit amend किया गया हो या कई commits हों, तो false positive आ सकते हैं
मैं
git lintalias से 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 करता था
असली समस्या तो सिर्फ unmerged branches की list output करने वाले हिस्से से भी हल हो सकती थी
यह अजीब है कि इतना natural काम कई lines के bash की माँग करता है
Git का codebase इतना बड़ा है, फिर भी यह built-in feature के रूप में नहीं मिलता, यह थोड़ा अफ़सोसजनक है
संबंधित blog post भी देखी जा सकती है
xargsया for loop थोड़ा-सा सीख लिया जाए, तो यह बहुत छोटी बात हैइसे built-in command बनाने के लिए कई तरह के edge cases संभालने पड़ेंगे, जिससे यह उल्टा और complex हो सकता है
आख़िर में “लगता है किसी ने अभी-अभी xargs सीखा है” जैसी प्रतिक्रिया भी आई
मैंने भी पहले blog posts और लेखों से ऐसी चीज़ें सीखी थीं
मैं आजकल TUI का आदी हूँ। कुछ भी असुविधाजनक लगे तो Claude-code से TUI बनवाने को कह देता हूँ
मैंने Textual library का इस्तेमाल करके Git worktree manage करने के लिए एक TUI बनाया, और Claude Python code काफ़ी अच्छा संभाल लेता है
tigनाम का पुराना Git TUI भी recommend किया गया। inspiration लेने के लिए भी अच्छा हैMagit की rebase feature पर यह लेख भी देखने लायक है
मैंने भी Fish shell में कुछ ऐसा ही बनाया है
यह
fzfसे remote पर गायब हुई ब्रांचें चुनकर delete करने वाला function हैमेरे dotfiles code में है