क्या मैं हिट करने के लिए मेटाडेटा जोड़ सकता हूं? या मैं कुछ टैग्स को gitk में छिपा सकता हूं




tags metadata (2)

Git-नोट्स

git notes साथ आप एक कमिट में "नोट" जोड़ सकते हैं। आप उन्हें अन्य Git ऑब्जेक्ट्स में भी जोड़ सकते हैं, लेकिन चलो केवल उन पर ध्यान केंद्रित करें क्योंकि यह सवाल क्या है।

एक नोट एक Git ऑब्जेक्ट है, और सिद्धांत रूप में "जो कुछ भी" (मनमाना डेटा) हो सकता है। लेकिन हम अपने उद्देश्यों के लिए कुछ सरल और पाठ्य पर ध्यान केंद्रित करेंगे।

उदाहरण: समीक्षा आईडी

प्रश्न में आईडी की समीक्षा का उल्लेख किया गया है, तो आइए ऐसी किसी चीज़ का प्रतिनिधित्व करने का कोई तरीका बनाते हैं। मुझे नहीं पता कि समीक्षा आईडी वास्तव में कैसी दिखती है, लेकिन उम्मीद है कि निम्नलिखित समझदार होगी:

Review-id: 42

तो यह प्रभावी रूप से एक कुंजी-मूल्य जोड़ी है। चलिए उपरोक्त स्ट्रिंग को वर्तमान कमिट में जोड़ते हैं:

git notes add -m "Review-id: 42"

यदि आप git log चलाते हैं तो नोट को इनलाइन दिखाया जाएगा: ( git log 1)

Author: Victor Version Control <[email protected]>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes:
    Review-id: 42

एक और उदाहरण

बेशक आप इस नोट में और अधिक "उप नोट" जोड़ सकते हैं (हम साधारण key: value साथ चिपके रहेंगे key: value सिंटैक्स, प्रति पंक्ति एक मान)। उदाहरण के लिए, यदि आपको तीन महीने बाद पता चला कि प्रतिबद्ध संदेश में कुछ गड़बड़ है, तो बस नोट में सुधार करें:

git notes append -m "Errata: It was actually feature y."

git log :

Author: Victor Version Control <[email protected]>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes:
    Review-id: 42

    Errata: It was actually feature y.

हम इस अतिरिक्त डेटा को आसानी से git notes append लिए git notes append उपयोग करते हैं। फ़ाइल को सीधे संपादित करने के लिए आप git notes edit का भी उपयोग कर सकते हैं।

बेशक, चूंकि जीआईटी नोट सिर्फ एक ही म्यूटेबल फाइल है, आप मर्ज संघर्ष में भाग सकते हैं। इस संभावना को कम करने के लिए, आप कर सकते हैं:

  1. ऊपर की तरह सरल डेटा से चिपके रहें (प्रति पंक्ति एक कुंजी-मूल्य)।
  2. विशेष मर्ज रणनीतियों का उपयोग करें; देखें man git-notes , अनुभाग "नोट्स मर्ज रणनीतियों"।

दृश्यता

ओपी ने पूछा:

> क्या मैं कुछ टैग अदृश्य कर सकता हूं?

डिफ़ॉल्ट रूप से, git log केवल एक नोट दिखाता है, जिसका नाम .git/refs/notes/commits । नेमस्पेस में commits सिर्फ एक नोट है। शायद आप चाहते हैं कि मुद्दे उनके अपने नामस्थान में हों:

git notes --ref=issues add -m "Fixes: #32"

चूंकि यह .git/refs/notes/issues में संग्रहीत है और .git/refs/notes/commits , "फिक्स: # 32" जब आप git log चलाते हैं, तो दिखाई नहीं देगा। इसलिए आपने डिफ़ॉल्ट रूप से ऐसे नोटों को प्रभावी रूप से अदृश्य कर दिया है।

यदि आप इसे दिखाना चाहते हैं, तो पास - --notes=issues को git log :

$ git log --notes=issues
Author: Victor Version Control <[email protected]>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes (issues):
    Fixes: #32

लेकिन अब .git/refs/notes/commits छिपे हुए हैं। जिसे आसानी से शामिल किया जा सकता है:

$ git log --notes=issues --notes=commits
Author: Victor Version Control <[email protected]>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes (issues):
    Fixes: #32

Notes:
    Review-id: 42

    Errata: It was actually feature y.

कॉन्फ़िगर करने के लिए चर हैं कि कौन से नोट डिफ़ॉल्ट रूप से दिखाए गए हैं; man git-config

संदेशों की तुलना में लाभ

मेटाडेटा निश्चित रूप से प्रतिबद्ध संदेश में सीधे दर्ज किया जा सकता है। (But 2) लेकिन प्रतिबद्ध संदेश अपरिवर्तनीय हैं, इसलिए उन्हें बदलने के लिए वास्तव में एक पूरी नई प्रतिबद्धता बनाने का मतलब है, जो कि सभी तेजस्वी परिणामों के साथ होता है। दूसरी ओर गिट-नोट्स परस्पर हैं, इसलिए आप उन्हें संशोधित करने में हमेशा सक्षम होते हैं। और एक नोट का प्रत्येक संशोधन निश्चित रूप से नियंत्रित संस्करण है। हमारे मामले में, .git/refs/notes/commits :

$ git log refs/notes/commits
Author: Victor Version Control <[email protected]>
commit 9f0697c6bbbc6a97ecce9834d4c9afa0d668bcad
Date:   Tue Nov 8 21:13:52 2016 +0100

    Notes added by 'git notes append'

commit b60997e49444732ed2defc8a6ca88e9e21001a1d
Author: Victor Version Control <[email protected]>
Date:   Tue Nov 8 21:10:38 2016 +0100

    Notes added by 'git notes add'

नोट साझा कर रहा है

आपके नोट डिफ़ॉल्ट रूप से साझा नहीं किए गए हैं; आपको स्पष्ट रूप से ऐसा करना होगा। और अन्य रेफरी की तुलना में, नोट्स साझा करना बहुत उपयोगकर्ता के अनुकूल नहीं है। हमें refspec सिंटैक्स का उपयोग करना होगा :

git push refs/notes/*

उपरोक्त आपके सभी नोटों को आपके रिमोट पर धकेल देगा।

ऐसा लगता है कि नोट लाने में कुछ अधिक शामिल है; आप इसे कर सकते हैं यदि आप refspec के दोनों किनारों को निर्दिष्ट करते हैं:

git fetch origin refs/notes/*:refs/notes/*

तो यह निश्चित रूप से सुविधाजनक नहीं है। यदि आप नियमित रूप से Git-notes का उपयोग करने का इरादा रखते हैं, तो आप संभवतः अपने gitconfig को हमेशा नोट्स लाने के लिए सेट करना चाहेंगे:

[remote "origin"]
    …
    fetch = +refs/notes/*:refs/notes/*

(स्रोत: https://git-scm.com/blog/2010/08/25/notes.html )

पुनर्लेखन पर नोटों को ले जाना

जीआईटी में असुविधाजनक डिफ़ॉल्ट है कि जब एक पुन: लिखा जाता है तो नोटों को खत्म नहीं किया जाता है। इसलिए यदि आप उदाहरण के लिए कमिट्स की एक श्रृंखला को रिबेट करते हैं, तो नोट्स नए कमिट्स पर नहीं जाएंगे।

चर notes.rewrite.<command> डिफ़ॉल्ट रूप से true सेट होता true , इसलिए कोई मान सकता है कि नोट खत्म हो गए हैं। लेकिन समस्या यह है कि चर नोट्स. notes.rewriteRef , जो यह निर्धारित करता है कि कौन से नोटों को ले जाया जाएगा, में कोई notes.rewriteRef नहीं है। सभी नोटों के मिलान के लिए यह मान सेट करने के लिए, निम्नलिखित को निष्पादित करें:

git config --global notes.rewriteRef "refs/notes/*"

git rebase जैसे पुनर्लेखन कार्यों को करते समय सभी नोटों को ले जाया जाएगा।

ईमेल पैच के माध्यम से नोट्स पर ले जाएँ

अगर आप ईमेल के रूप में भेजे जाने के लिए अपने परिवर्तनों को प्रारूपित करने के लिए git format-patch का उपयोग कर रहे हैं, और आपके पास कुछ नोट्स के रूप में संग्रहीत मेटाडेटा है, तो आप नोट को ईमेल में भेजने के लिए git format-patch को बदलने के लिए विकल्प को पारित कर सकते हैं। प्रारूप।

† 1: "यह git log लिए डिफ़ॉल्ट है […] जब कमांड लाइन पर कोई --pretty , --pretty , या --oneline विकल्प नहीं दिया गया है।" - man git-log , git संस्करण 2.10.2।

† 2: मेटाडेटा-इन-कमिट मैसेज के लिए एक प्रैक्टिस / कन्वेंशन जो कि Git और Linux कर्नेल जैसे प्रोजेक्ट्स में इस्तेमाल किया जाता है, कमिट-मैसेज के "ट्रेलर" में की-वैल्यू पेयर को जोड़ना है, यानी सबसे नीचे। उदाहरण के लिए देखें लिनुस टॉर्वाल्ड्स द्वारा यह प्रतिबद्ध :

 mm: remove gup_flags FOLL_WRITE games from __get_user_pages()
 This is an ancient bug that was actually attempted to be fixed once
 (badly) by me eleven years ago in commit 4ceb5db9757a ("Fix
 get_user_pages() race for write access") but that was then undone due to
 problems on s390 by commit f33ea7f404e5 ("fix get_user_pages bug").

 In the meantime, the s390 situation has long been fixed, and we can now
 fix it by checking the pte_dirty() bit properly (and do it better).  The
 s390 dirty bit was implemented in abf09bed3cce ("s390/mm: implement
 software dirty bits") which made it into v3.9.  Earlier kernels will
 have to look at the page state itself.

 Also, the VM has become more scalable, and what used a purely
 theoretical race back then has become easier to trigger.

 To fix it, we introduce a new internal FOLL_COW flag to mark the "yes,
 we already did a COW" rather than play racy games with FOLL_WRITE that
 is very fundamental, and then use the pte dirty flag to validate that
 the FOLL_COW flag is still valid.

 Reported-and-tested-by: Phil "not Paul" Oester <[email protected]>
 Acked-by: Hugh Dickins <[email protected]>
 Reviewed-by: Michal Hocko <[email protected]>
 Cc: Andy Lutomirski <[email protected]>
 Cc: Kees Cook <[email protected]>
 Cc: Oleg Nesterov <[email protected]>
 Cc: Willy Tarreau <[email protected]>
 Cc: Nick Piggin <[email protected]>
 Cc: Greg Thelen <[email protected]>
 Cc: [email protected]
 Signed-off-by: Linus Torvalds <[email protected]>

देख:

  • man git-interpret-trailers
  • यह कर्नेल विकी पेज जो विभिन्न ट्रेलर लाइनों (आमतौर पर कुंजी-मूल्य जोड़े) को सूचीबद्ध करता है जो विभिन्न परियोजनाओं में उपयोग किए जाते हैं।

मैं एक मेटा git commit साथ कस्टम मेटाडेटा को जोड़ना चाहता हूं। विशेष रूप से एक कोड समीक्षा से एक समीक्षा आईडी रिकॉर्ड करने के लिए लेकिन यह कुछ भी हो सकता है। टैग ऐसा करने का एक स्वाभाविक तरीका लगता है, लेकिन मुझे उम्मीद है कि हर कमिटमेंट के लिए एक समीक्षा हो और मैं टैग के टन के साथ gitk को gitk नहीं चाहता। क्या कस्टम मेटाडेटा को जोड़ने के लिए कुछ अन्य तंत्र है? क्या मैं कुछ टैगों को अदृश्य बना सकता हूं? अगर मैं gitk को कुछ पैटर्न या आरई से मिलान करने वाले टैग प्रदर्शित नहीं करने के लिए कह सकता हूं, तो यह काम करेगा लेकिन मुझे ऐसा करने का कोई तरीका नहीं दिखता है।






gitk