कोड पढ़ने से पहले चलाने वाले Git commands
(piechowski.io)- नई codebase को समझते समय Git history analysis से project की structure और risk areas को पहचानकर अधिक प्रभावी exploration direction तय की जा सकती है
- पिछले 1 साल में सबसे ज़्यादा बदली गई files ढूँढकर change frequency और bug concentration का cross-analysis करके high-risk code पहचाना जा सकता है
- Contributor distribution और activity trends के आधार पर bus factor, maintenance gaps और knowledge silos की संभावना की जाँच की जा सकती है
- महीनेवार commit counts से team की development speed और momentum में बदलाव ट्रैक किए जा सकते हैं, और Revert·Hotfix frequency से deployment stability का आकलन किया जा सकता है
- ये पाँच commands code की एक भी line खोले बिना project health को जल्दी diagnose करने के practical tools की तरह काम आ सकती हैं
कोड पढ़ने से पहले चलाने वाले पाँच Git commands
- नई codebase का analysis करते समय, files खोलने से पहले Git history से project health diagnose करने का यह approach उपयोगी है
- commit history के माध्यम से इसे किसने बनाया, समस्याएँ कहाँ केंद्रित हैं, और team कितनी स्थिरता से deploy करती है यह समझा जा सकता है
-
सबसे ज़्यादा क्या बदलता है
- command:
git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20 - पिछले 1 साल में सबसे अधिक संशोधित हुई top 20 files दिखाता है
- top files अक्सर वे होती हैं जिन्हें team “छूने से डरती” है; जब high churn और ownership avoidance साथ आते हैं, तो वे codebase का सबसे बड़ा burden बन सकती हैं
- Microsoft Research (2005) के अनुसार change frequency आधारित metrics, complexity metrics की तुलना में defects predict करने में अधिक प्रभावी थे
- top 5 files को bug concentration command के साथ cross-analyze करके ज़्यादा बदलने वाली और ज़्यादा bugs वाली files को सबसे बड़े risk factor के रूप में पहचाना जा सकता है
- command:
-
यह code किसने बनाया
- command:
git shortlog -sn --no-merges - commit count के आधार पर contributors की ranking करता है
- अगर एक व्यक्ति 60% से अधिक हिस्सेदारी रखता है, तो bus factor का जोखिम मौजूद है
- अगर top contributor पिछले 6 महीनों में सक्रिय नहीं रहा, तो maintenance gap की संभावना है
- अगर 30 contributors में से पिछले 1 साल में सिर्फ 3 ही सक्रिय हैं, तो developer turnover के कारण knowledge break हो सकता है
- लेकिन squash-merge strategy इस्तेमाल करने वाली teams में author information merger के पक्ष में distort हो सकती है, इसलिए merge strategy की जाँच ज़रूरी है
- command:
-
bugs कहाँ केंद्रित हैं
- command:
git log -i -E --grep="fix|bug|broken" --name-only --format='' | sort | uniq -c | sort -nr | head -20 - bug-related keywords वाले commits के आधार पर bug-prone top 20 files निकालता है
- इस list को change frequency list से तुलना करके बार-बार बदलने वाली और बार-बार टूटने वाली files को high-risk code के रूप में पहचाना जा सकता है
- commit message quality के अनुसार result की accuracy बदल सकती है, लेकिन एक rough bug density map के रूप में भी यह काफ़ी उपयोगी है
- command:
-
project तेज़ हो रहा है या ठहर रहा है
- command:
git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c - महीनेवार commit counts से activity trend को दृश्य रूप में समझा जा सकता है
- एक स्थिर rhythm, healthy project का संकेत है
- अगर एक महीने में commit count आधा हो जाए, तो key staff departure की संभावना हो सकती है
- 6~12 महीनों तक लगातार गिरावट team momentum में कमी का संकेत है, जबकि समय-समय पर तेज़ उछाल और फिर ठहराव batch-style release pattern दिखा सकता है
- एक वास्तविक उदाहरण में commit velocity chart देखकर CTO ने पहचाना कि “यही वह समय था जब senior engineer गया था”
- यह data code data नहीं, team data होने के कारण भी अर्थपूर्ण है
- command:
-
team कितनी बार emergency response में जाती है
- command:
git log --oneline --since="1 year ago" | grep -iE 'revert|hotfix|emergency|rollback' - Revert·Hotfix frequency मापता है
- साल में कुछ बार होना सामान्य है, लेकिन अगर यह हर 2 हफ़्ते में हो रहा है, तो यह deployment process पर अविश्वास का संकेत है
- यह unstable testing, staging की कमी, और complex rollback procedures जैसी गहरी समस्याओं का लक्षण हो सकता है
- अगर result 0 है, तो team स्थिर हो सकती है या commit messages सटीक नहीं हैं
- crisis patterns साफ़ दिखाई देते हैं, और सिर्फ़ उनका मौजूद होना भी reliability का अंदाज़ा देने के लिए काफ़ी है
- command:
निष्कर्ष
- ये पाँच commands कुछ ही मिनटों में चलाई जा सकती हैं, और code की एक भी line खोले बिना कहाँ से पढ़ना शुरू करना चाहिए इसकी दिशा दिखाती हैं
- इससे पहले दिन बिना दिशा के खोजबीन करने के बजाय problem areas पर केंद्रित systematic code analysis संभव होता है
- यह प्रक्रिया codebase audit के पहले एक घंटे के बराबर है, और इसके बाद एक हफ़्ते तक चलने वाली analysis प्रक्रिया की शुरुआत बन सकती है
1 टिप्पणियां
Hacker News की राय
Jujutsu में git analysis commands की जगह इस्तेमाल किए जा सकने वाले उदाहरण साझा किए गए
पिछले 1 साल में सबसे ज़्यादा बदली गई files, मुख्य contributors, जहाँ bugs ज़्यादा केंद्रित हैं, project की जीवंतता, urgent fixes की frequency आदि को
jj logcommand से देखा जा सकता हैshell script की तुलना में इसका syntax programming के ज़्यादा क़रीब है, लेकिन याद रखने वाले flags कम हैं
जैसे Nix शानदार है लेकिन complexity बढ़ा देता है, jujutsu भी वैसा ही लगा
कुछ महीनों तक इस्तेमाल करने के बाद मैं फिर git पर लौट आया। git हाथ में बैठ चुका है और हर जगह इस्तेमाल होता है
jqमें array loop ही याद रह जाए तो खुशी होती है, ऐसी syntax तो बिल्कुल समझ में नहीं आतीjjहो याgit, दोनों के commands इतने लंबे और complex हैं कि इन्हें याद करने का इरादा नहीं हैअगर बार-बार इस्तेमाल करना हो तो alias बनाकर छोटा कर लूँगा
उदाहरण के लिए एक QR code generation library है जिसमें 10 साल से update नहीं आया, लेकिन वह पूरी तरह सही चलती है
कभी-कभी लगता है कि क्या बस बेकार commits जोड़ने के लिए bot चला देना चाहिए
इसलिए jujutsu जैसे tools से ज़्यादा पारंपरिक UNIX pipe commands पसंद हैं
Gradle की जगह Maven इस्तेमाल करने की वजह भी यही है
यह मज़ेदार था कि लेखक ने मान लिया कि developers commit messages अच्छे लिखते हैं
असलियत में ज़्यादातर “changed stuff” स्तर का ही लिखते हैं
मेरी तरह commit log को गंभीरता से लेने वाले लोग कम हैं
AI-generated commit messages इस समस्या में काफ़ी मदद कर सकते हैं
developer commit messages जैसे चाहें लिख सकते हैं, क्योंकि बाद में वैसे भी कोई नहीं पढ़ता
Core में PR review और detailed explanation ज़रूरी हैं, जबकि Non-Core में खुलकर experiment किया जा सकता है
Core में कभी-कभी commit message code से 20 गुना लंबा होता है, जबकि Non-Core में “hope this works” स्तर चलता है
हमारी company में हम एक-दूसरे से इसकी अपेक्षा रखते हैं
मैंने कई codebases पर commands चलाकर देखे, लेकिन results असली स्थिति से मेल नहीं खाते थे
उदाहरण के लिए
git shortlog -sn --no-mergesमें सबसे ज़्यादा commits वाला व्यक्ति कभी-कभी कंपनी छोड़ चुका होता हैcommits ज़्यादा होने का मतलब contribution ज़्यादा होना नहीं है
ज़रूरत से ज़्यादा commits को सिर्फ feature branch में रखा जाए, और main में साफ़-सुथरा merge किया जाए
सामान्य codebase में ये अक्सर बस बेअर्थ results देते हैं
क्योंकि project मैंने शुरू से बनाया था, जबकि अब दूसरे लोग मुझसे ज़्यादा बार commit करते हैं
यह बात दिलचस्प लगी कि “सबसे ज़्यादा बदली गई file वही file है जिसे लोग छूने से डरते हैं”
सिर्फ output देखकर निष्कर्ष निकालना उल्टा मूर्खतापूर्ण लग सकता है
असल में ये बस इतना दिखाती हैं कि पिछले 1 साल में किन features पर काम हुआ
जहाँ दोनों ऊँचे हों, वही असली problem area होता है
ऐसे areas जमा होते-होते लोग कहते हैं, “app को शुरू से फिर लिखना पड़ेगा”
सबको उन्हें बदलना पड़ता है, लेकिन वे इतनी बड़ी होती हैं कि संभालना मुश्किल हो जाता है
मैंने git में एक summary alias बनाया है जो branch summary, commit count, author count, file count आदि एक साथ दिखाता है
idea GitAlias/gitalias से मिला
.gitconfigfunction के रूप में क्यों लिखा गया, git-summary script बनाना ज़्यादा आसान लगता हैlog-of-count-and-emailजैसा command नहीं हैregex में word boundary (
\b) जोड़नी चाहिएउदाहरण के लिए “debugger” के अंदर “bug” होने से ग़लत result आ सकता है
सुधरा हुआ उदाहरण यह है
git log -i -E --grep="\b(fix|fixed|fixes|bug|broken)\b" ...\bsupport नहीं करता, इसलिए-Eकी जगह Perl regex option-Pइस्तेमाल करना होगाइसे
git log -i -P --grep="\b(...)\b"के रूप में बदला जा सकता हैअगर squash-merge नहीं किया जाए, तो सबसे ज़्यादा commits वाला व्यक्ति उल्टा सबसे ख़राब developer भी हो सकता है
पहले ऐसा एक व्यक्ति था, जो बार-बार उसी file को ठीक करता रहा और आख़िरकार निकाल दिया गया
squash ऐसे मामलों को छिपा देने का अच्छा तरीका है
सिर्फ़ commit count stats पर भरोसा करना मुश्किल है
कोई व्यक्ति पूरी तरह tested code commit करता है, और कोई दूसरा एक-एक line करके बार-बार commit करता है
एक commit की value व्यक्ति-दर-व्यक्ति 100 गुना तक अलग हो सकती है
absolute value से ज़्यादा change rate मायने रखती है
यह analysis approach Adam Tornhill की “Your Code as a Crime Scene” की याद दिलाती है
मूल लिंक
और Developer’s Legacy Index की concept से भी मिलती-जुलती है
अगर लेखक हर command का actual output भी दिखाता तो और अच्छा होता
सिर्फ explanation से ज़्यादा output examples ज़्यादा भरोसेमंद लगते