Git Notes: Git का सबसे शानदार और सबसे नापसंद किया गया फीचर (2022)
(tylercipriani.com)- Git notes Git objects को बदले बिना अलग namespace में metadata जोड़ने की सुविधा है, लेकिन कम usability और सीमित adoption के कारण इसका व्यापक उपयोग नहीं होता
- पुराने commit messages को बदले बिना नई जानकारी जोड़ी जा सकती है, इसलिए यह review, build, ticket जानकारी जैसे automation systems द्वारा छोड़े गए records के लिए अच्छी तरह उपयुक्त है
- Git project और Gerrit notes का असल उपयोग करते हैं, जिससे हर commit के लिए mailing list discussions, test results और reviewer जानकारी
git logमें देखी जा सकती है - Google का git-appraise git notes के ऊपर distributed code review लागू करता है, ताकि review requests, comments, reviews और merge स्थानीय रूप से किए जा सकें
- GitHub ने 2014 में commit notes दिखाना बंद कर दिया, और blob/tree notes के लिए Git internal commands की समझ चाहिए, इसलिए project history को distribute करने की संभावना होने के बावजूद इन्हें इस्तेमाल करना कठिन है
Git objects को बदले बिना metadata
- Git notes Git द्वारा track किए जाने वाले objects में अलग metadata store करने की सुविधा है
- लक्ष्य सिर्फ commits नहीं, बल्कि blob और tree भी शामिल हैं
- object को खुद modify किए बिना अलग namespace में जानकारी जोड़ी जाती है
- history में पहले से शामिल commit messages को आम तौर पर सुरक्षित तरीके से बदलना मुश्किल होता है, लेकिन notes का उपयोग करके पुराने commits में भी नई जानकारी जोड़ी जा सकती है
- नीचे की तरह
git notes add -mसे note जोड़ा जा सकता हैgit notes add -m 'Acked-by: <tyler@tylercipriani.com>' - इसके बाद
git logमें उस commit के नीचेNotes:block के रूप में दिखता है
- नीचे की तरह
- Scott Chacon ने 2010 में GitHub.blog पर notes को अन्य developers के साथ बातचीत से ज्यादा ticket/build systems जैसे automated records जोड़ने के लिए अधिक उपयुक्त feature माना
वास्तविक उपयोग और रुकावटें
- Git project हर commit को mailing list discussion से जोड़ने के लिए notes का उपयोग करता है
- उदाहरण commit के
Notes (amlog)मेंMessage-Idहोता है, और यह value patch discussion thread तक ले जाती है
- उदाहरण commit के
- notes का उपयोग commit या branch के अनुसार work time tracking,
git logमें review/test जानकारी जोड़ने, और fully distributed code review जैसे उद्देश्यों के लिए भी किया जाता है - Gerrit का reviewnotes plugin code review metadata को Git के अंदर offline देखने योग्य बनाता है
- notes fetch करने और दिखाने के commands ये हैं
git fetch origin refs/notes/review:refs/notes/review git log --show-notes=review - दिखाई जाने वाली जानकारी में
Verified+1,Verified+2,Code-Review+2,Submitted-by,Submitted-at,Reviewed-on,Project,Branchआदि शामिल हैं
- notes fetch करने और दिखाने के commands ये हैं
- Google का git-appraise git notes के ऊपर बना “fully distributed code review” system है
- यह GitHub, GitLab जैसे code forge से स्वतंत्र रूप से काम करता है
- change review requests, changes पर comments, reviews और merge स्थानीय computer पर किए जा सकते हैं
- इसमें web interface भी शामिल है
- सबसे बड़ी कमजोरी usability है
- GitHub ने 2014 में commit notes दिखाना बंद कर दिया
- commit notes के लिए
gitconfigsettings से automatic fetch औरgit logdisplay को कुछ हद तक आसान बनाया जा सकता हैgit config --add \ remote.origin.fetch \ '+refs/notes/*:refs/notes/*' git config \ notes.displayRef \ 'refs/notes/*' - blob या tree में notes store करने के लिए Git की plumbing से परिचित होना जरूरी है
- Git code history को distribute करता है, लेकिन Git repository की बहुत-सी value GitHub जैसे forge के अंदर बंद रहती है
- git notes सिर्फ code ही नहीं, बल्कि पूरे project history को distribute करने का रास्ता बन सकते हैं
1 टिप्पणियां
Hacker News की रायें
एक और कम-ज्ञात फीचर git trailers है: https://alchemists.io/articles/git_trailers
यह key-value संरचित डेटा है जिसे commit बनाते समय शामिल किया जा सकता है, और कुछ systems इसे metadata जोड़ने के लिए इस्तेमाल करते हैं। उदाहरण के लिए Gerrit, Change-Id जोड़ने के लिए इसी फीचर का उपयोग करता है
यह PostgreSQL के कई database objects में text जोड़ने देता है। अच्छा होगा अगर PostgreSQL में भी editable, structured key-value रूप में database object metadata का फीचर हो
[skip ci]डालने के विकल्प के तौर पर git trailers इस्तेमाल करता है, शायद इसलिए कि commit message consume करने वाले downstream systems के लिए इसे हटाना आसान हो: https://docs.github.com/en/actions/managing-workflow-runs-an...यह क्यों enforce करता है कि वह आखिरी trailer ही हो, पता नहीं; शायद regex की वजह से हो
open source upstream के साथ काम करते समय, जब
git rebase -iसे branch को पूरी तरह polish करना चाहता था, तब यह उपयोगी था। अब लगता है कि वह जानकारी git trailers में रखना बेहतर होगा। Change-Id के मामले में, अच्छा होगा अगर Git में खुद ऐसे identifiers हों जिन्हें tools भी समझ सकें। commit message से commit identify करना fragile है, खासकर MR में जब message बदला जा सकता हो। commit ID किसी commit को uniquely identify करता है, लेकिन जब वही बदलाव किसी दूसरे commit के ऊपर ले जाया जा सकता हो, तब वह उपयोगी identifier नहीं रहता। हालांकि trailers असली commit का हिस्सा होते हैं और notes नहीं, इसलिए मेरे इस्तेमाल वाले case में यह अच्छा विकल्प नहीं होगासोच रहा हूँ कि commit message में manually डालना और
--trailerflag इस्तेमाल करना functionally एक जैसा है या नहींlocal पर instance चलाकर उसे GitHub पर hosted repository के साथ integrate करने की कोशिश की, लेकिन सिर्फ निराशा मिली। सोचता हूँ क्या कोई ऐसा alternative है जो commits के पार changes tracking वगैरह GitHub से बेहतर handle करता हो, ज्यादा actively develop हो रहा हो और GitHub integration-friendly भी हो। GitHub के code review tools मुझे सच में नापसंद हैं
Forgejo भी इस साल जनवरी में आए version 10 से support करता है: https://forgejo.org/2025-01-release-v10-0/#new-features
https://codeberg.org/forgejo/forgejo/pulls/4753
यह सच में शानदार दिखता है, लेकिन जानना चाहता हूँ कि amend या rebase जैसे history rewriting features, जो असल में commit को संशोधित copy से बदल देते हैं, notes के साथ कैसे काम करते हैं
लगता है notes किसी specific commit, tree या blob ID से जुड़ते हैं। सोचता हूँ कि
git rebaseआदि इतने smart हैं कि notes को नए commits पर copy कर दें, या वे बस गायब हो जाते हैं। interactive rebase में कई commits को squash करके एक कर दें तो क्या होता है, यह भी सवाल है। blobs और trees पर notes लगाने में भी वही समस्या लगती है। यह repository की files या directories पर metadata लगाने जैसा महसूस होता है, लेकिन असल में यह specific content से जुड़ता है। उदाहरण के लिए अगर"Hello world!"string वाले blob पर note लगाएँ, तो क्या Git उस content वाली सभी files से note जोड़ देगा? और अगर किसी file को"Hello, world!"में बदल दें, तो क्या notes खो जाएँगे?notes.rewriteentriesgit-config(1)में देखी जा सकती हैंशायद 10 साल से Git इस्तेमाल कर रहा हूँ, लेकिन पता नहीं था कि git notes मौजूद है। बढ़िया
“हर forge code review metadata को Git के अंदर offline इस्तेमाल करने लायक बनाए” वाली request शायद GitHub जैसे commercial forges पर ज्यादा असर नहीं करेगी। जैसा आपने खुद कहा, Git repository की बहुत-सी value GitHub जैसे forges में locked है। for-profit कंपनियाँ आम तौर पर अपने added value को generic बनाने में खास उत्साहित नहीं होतीं। मैं GitHub को दोष नहीं दे रहा; वे बेहतरीन service और बहुत generous free tier देते हैं, और अगर आप migrate करना चाहें तो API के ज़रिए सारा data निकालने देते हैं—इस लिहाज से वे अच्छा कर रहे हैं। बात बस commercial operations की nature की है
Git notes तभी शानदार लगते हैं जब commit बन जाने और दूसरों को दिख जाने के बाद उसमें अक्सर text जोड़ना हो
Acked-By और mailing list discussion link वाले उदाहरण अच्छे उदाहरण नहीं लगते। दोनों के बारे में commit बनाते समय पहले से पता होने की संभावना ज्यादा है। Git commit message में व्यावहारिक रूप से लंबाई की सीमा लगभग नहीं होती, इसलिए forge पर हुई commit-संबंधी चर्चा को सीधे commit message में ही कॉपी किया जा सकता है। मेरे हिसाब से बेहतर उदाहरण वह है जब बाद में revert किए गए commit में git note जोड़ा जाए
शायद मैं ही अजीब हूं, लेकिन मैंने बहुत सारे colleagues देखे हैं जो यह याद करने के लिए comments या annotate ठीक से नहीं देखते कि code शुरू में क्यों लिखा गया था। वे बस तुरंत बदल देते हैं और उम्मीद करते हैं कि समस्या उनसे न जुड़े। लेकिन अगर आपने bug fix का इंतज़ार कर रहे नाराज़ customer को संभाला हो, और कुछ ही समय बाद वही bug फिर वापस आते देखा हो, तो bug fix में ज्यादा सावधानी आ सकती है। कई bugs को एक साथ fix करने के लिए अक्सर refactoring चाहिए होती है, और refactoring नई feature opportunities या performance improvements भी खोल सकती है
बाद में revert किए गए commit पर निशान छोड़ने के लिए commit message बेहतर है। किसी file पर blame करने से उस file का latest change दिखता है, और अगर किसी commit ने दूसरे commit के बदलाव को revert किया है, तो ज्यादा नया revert commit blame में दिखाई देगा
यह knowledge की कमी नहीं, UI problem है। अगर GitHub UI notes दिखाने लगे तो usage तुरंत बहुत बढ़ जाएगा
“Git की सबसे शानदार लेकिन कम पसंद की गई feature” कई हैं। जैसे bisect, pickaxe, reflog, range-diff, archive, annotated tags आदि
अफसोस है कि बहुत से लोग Git को बस एक चमकदार Google Drive जैसा मानते हैं, इसलिए ये features अक्सर भूल जाते हैं
फिर भी मुझे यह ठीक लगता है। Unix philosophy है कि एक चीज़ पर focus करो और उसे अच्छी तरह करो
LibreOffice project में Apache OpenOffice repository के हर commit को track करने के लिए Git notes का इस्तेमाल हुआ था
उस repository को LibreOffice Git repository की branch के रूप में mirror करते हुए, उन्होंने दर्ज किया कि हर commit irrelevant change है या नहीं—जैसे build system change जिसे LibreOffice ने बहुत पहले बेहतर चीज़ से बदल दिया था—या वह change पहले से LibreOffice में मौजूद change का duplicate है, या दुर्लभ cases में LibreOffice में स्वीकार किया गया और किस commit के रूप में cherry-pick किया गया। इसे अभी भी https://cgit.freedesktop.org/libreoffice/core/log/?h=aoo/tru... पर सीधे देखा जा सकता है, और यह Git frontend अब भी notes दिखाता है। कुछ साल पहले से उन्होंने इस तरह की change tracking बंद कर दी है, शायद इसलिए कि Apache OpenOffice में changes की गति बहुत धीमी हो गई और कुछ ही changes को cherry-pick करके मिलने वाला फायदा ज्यादा नहीं रहा
यह सबसे शानदार लेकिन कम पसंद की गई feature नहीं, बल्कि ऐसी gimmick feature के ज्यादा करीब है जो बहुत खास cases में अच्छी हो सकती थी, जैसे पूरी company को सिर्फ developers की team के रूप में चलाना
जो जरूरी है वह commit message में जाता है, और अलग system के ticket को reference करना bug नहीं बल्कि feature है। क्योंकि JIRA या दूसरे systems non-developers से communicate करने के लिए इस्तेमाल होते हैं। उदाहरण के लिए business analyst के पास code या repository access बिल्कुल नहीं होता, और support staff के पास भी repository और code access नहीं होता। non-developers के लिए notes देखने और edit करने वाला frontend बनाया जा सकता है, लेकिन फिर भी उसका खास मतलब नहीं होगा। BA या support team आदि को specific commits में दिलचस्पी नहीं होती, और कोई feature किसी एक commit से ठीक-ठीक match हो सकता है, लेकिन आम तौर पर ऐसा नहीं होता। अगर कई repositories इस्तेमाल हों और एक feature कई services में फैला हो, तो git notes काफी बेकार हो जाते हैं, और आखिरकार external system का reference चाहिए होता है
लेकिन यही mainstream है। कभी-कभी उसी monorepo को share करने वाली दूसरी team का analyst मुझसे ऐसा सवाल पूछता है जिसका जवाब code की एक line से तुरंत दिया जा सकता है। वह analyst technical भी है और SQL भी जानता है, और हमारा code बहुत idiomatic और high-level तरीके से लिखा गया है। फिर भी culture अपनी अंतर्निहित inefficiency से मरने तक खुद को बदल नहीं पाता
[^1] https://news.ycombinator.com/item?id=44348438
GitLab में notes support मांगने वाली 9 साल पुरानी feature request हाल में बंद कर दी गई: https://gitlab.com/gitlab-org/gitlab/-/issues/15029
दुर्भाग्य से पढ़ने के लिए login करना होगा, लेकिन कोई भी gitlab.com account काम कर जाना चाहिए