ट्रेलर विकल्प गिट - व्याख्या विकल्प में

Dec 20 2020

मैं git लॉग से योगदान का सारांश निकालने और उस का संक्षिप्त सारांश बनाने का प्रयास कर रहा था और रिपोर्ट प्रस्तुत करने के लिए उसमें से एक excel / csv बना सकता था।

मैंने कोशिश की

git log --after="2020-12-10" --pretty=format:'"%h","%an","%ae","%aD","%s","(trailers:key="Reviewed By")"'

और CSV अंत में रिक्त CSV कॉलम की तरह दिखता है।

...
"7c87963cc","XYZ","[email protected]","Tue Dec 8 17:40:13 2020 +0000","[TTI] Add support for target hook in compiler.", ""
...

और git logकुछ इस तरह दिखता है

commit 7c87963cc
Author: XYZ <[email protected]>
Date:   Tue Dec 8 17:40:13 2020 +0000

    [TTI] Add support for target hook in compiler.

    This adds some code in the TabeleGen ...
    This is my body of commit.

    Reviewed By: Sushant

    Differential Revision: https://codereviews.com/DD8822

जो मैं सफल नहीं हो सका Differential Revisionवह (trailers:key="Reviewed By")कमांड का उपयोग करके स्ट्रिंग को निकालने में था ।

मैं इस काम को पाने के लिए बहुत कुछ नहीं पा सका। मैंने गिट मैनुअल की जाँच की और मैंने कोशिश की कि यह क्या समझाता है।

क्या इस कमांड में मुझे कुछ याद आ रहा है? अपेक्षित आउटपुट https://codereviews.com/DD8822में उपरोक्त सीवीएस आउटपुट में अंतिम स्थान पर पाठ होना चाहिए ।

जवाब

3 fluffy Dec 20 2020 at 20:09

मुझे यकीन नहीं है लेकिन:

  • ट्रेलर कुंजी में व्हाट्सएप नहीं हो सकता (इसलिए Reviewed By-> Reviewed-By, और Differential Revision-> Differential-Revision);
  • ट्रेलरों को नई लाइनों द्वारा सीमांकित नहीं किया जाना चाहिए, लेकिन कमिट मैसेज से अलग किया गया है (इसलिए Reviewed Byआपके प्रश्न से ट्रेलर के रूप में नहीं माना जाता है)।

मैं CSV का उपयोग करने की भी सिफारिश नहीं करूंगा, लेकिन इसके बजाय TSV का उपयोग कर रहा हूं: git आउटपुट CSV सिंटैक्स (अर्ध-कॉलन और कॉमा से बचने) के बारे में पता नहीं है, इसलिए आउटपुट दस्तावेज़ अप्रकाशनीय हो सकता है।

यदि आपके प्रतिबद्ध संदेश इस तरह दिखेंगे ( -स्थान के बजाय, कोई नई पंक्ति सीमांकक नहीं):

commit 7c87963cc
Author: XYZ <[email protected]>
Date:   Tue Dec 8 17:40:13 2020 +0000

    [TTI] Add support for target hook in compiler.

    This adds some code in the TabeleGen ...
    This is my body of commit.

    Reviewed-By: Sushant
    Differential-Revision: https://codereviews.com/DD8822

फिर निम्न कमांड आपके लिए काम करेगी:

git log --pretty=format:'%h%x09%an%x09%ae%x09%aD%x09%s%x09%(trailers:key=Reviewed-By,separator=%x20,valueonly)%x09%(trailers:key=Differential-Revision,separator=%x20,valueonly)'

अपने टैब-अलग किए गए मान आउटपुट में शॉर्ट कम आईडी, लेखक का नाम, लेखक का ईमेल, दिनांक, प्रतिबद्ध संदेश, ट्रेलर Reviewed-Byऔर ट्रेलर Differential-Revisionका उत्पादन करना।


आप नहीं बदल सकते हैं पुराने संदेशों के लिए प्रतिबद्ध है क्योंकि आपके इतिहास यह कर (यह प्रकाशित होने के साथियों द्वारा खींच लिया, अपने उपकरणों प्रकाशित प्रतिबद्ध हैश करने के लिए बाध्य कर रहे हैं) के लिए सुरक्षित नहीं है, तो आप कार्रवाई करने के लिए है git logउत्पादन के साथ sed, awk, perl, या किसी भी आपकी रिपोर्ट उत्पन्न करने के लिए अन्य टेक्स्ट-ट्रांसफ़ॉर्मिंग टूल। कहो, कुछ इस तरह की प्रक्रिया करें git log --pretty=format:'%x02%h%x1F%an%x1F%ae%x1F%aD%x1F%s%x1F%n%B'जहां ^Bएसटीएक्स (ईटीएक्स) और ईओएफ के बीच की रेखाओं का विश्लेषण किसी तरह किया जाना चाहिए (आपके लिए रुचि रखने वाले ट्रेलरों के लिए फ़िल्टर्ड), फिर शुरू होने वाले उनके समूह लाइनों में शामिल हो गए ^Bऔर फिर चरित्र को फ़ील्ड और एंट्री विभाजकों के साथ बदल दिया गया \tऔर नहीं क्रमशः चरित्र।

लेकिन फिर, यदि आप कमिट मैसेज ट्रेलरों को ठीक करके इतिहास को संपादित कर सकते हैं (यह सुनिश्चित नहीं है कि यह कितना प्रभावित हो सकता है), तो मैं आपको ऐसा करने की सलाह दूंगा और फिर अतिरिक्त स्क्रिप्ट प्रोसेसिंग ट्रेलरों के विचार को अस्वीकार कर दूंगा जिन्हें मान्यता प्राप्त नहीं है git-interpret-trailersऔर बस ठीक करें संदेश दें।


1 संपादित करें (पाठ उपकरण)

यदि इतिहास को फिर से लिखना एक विकल्प नहीं है, तो कुछ लिपियों को लागू करने से आपको मदद मिल सकती है। मैं शक्तिशाली लेखन में बहुत कमजोर कर रहा हूँ sed/ awk/ perlलिपियों, लेकिन मेरे कोशिश करते हैं।

git log --pretty=format:'%x02%h%x1F%an%x1F%ae%x1F%aD%x1F%s%x1F%n%B' \
    | gawk -f trailers.awk \
    | sed '$!N;s/\n/\x1F/' \
    | sed 's/[\x02\x1E]//g' \
    | sed 's/\x1F/\x09/g'

यह काम किस प्रकार करता है:

  • gitमानक C0 C1 कोड के साथ सीमांकित डेटा का बना एक लॉग उत्पन्न करता है, यह मानते हुए कि आपके प्रतिबद्ध संदेश (STX, RS और US) में ऐसे कोई अक्षर नहीं हैं - मैं वास्तव में नहीं जानता कि क्या यह उनके जैसा उपयोग करने के लिए एक अच्छी जगह है और यदि मैं उन्हें लागू करता हूं शब्दार्थ);
  • gawk एसटीएक्स-शुरू किए गए समूहों को पार्स करने और "दो-पंक्ति" आउटपुट (नियमित डेटा के लिए प्रत्येक विषम रेखा, अल्पविराम से जुड़े ट्रेलर मानों के लिए भी प्रत्येक पंक्ति को गायब करना) के लिए लॉग आउटपुट को फ़िल्टर करने की कोशिश करता है;
  • sedजोड़े से अजीब और यहां तक ​​कि रेखाएं जुड़ती हैं (क्रेडिट Karoly Horvath पर जाते हैं );
  • sed STX और RS को हटा देता है;
  • sed अमेरिका को TAB से बदल देता है।

यहाँ है trailers.awk(फिर से मैं एक awkआदमी नहीं हूँ और पता नहीं कैसे मुहावरेदार निम्नलिखित स्क्रिप्ट यह है, लेकिन यह काम करने के लिए लगता है):

#!/usr/bin/awk -f

BEGIN {
    FIRST = 1
    delete TRAILERS
}

function print_joined_array(array) {
    if ( !length(array) ) {
        return
    }
    for ( i in array ) {
        if ( i > 0 ) {
            printf(",")
        }
        printf("%s", array[i])
    }
    printf("\x1F")
}

function print_trailers() {
    if ( FIRST ) {
        FIRST = 0
        return
    }
    print_joined_array(TRAILERS["Reviewed By"])
    print_joined_array(TRAILERS["Differential Revision"])
    print ""
}

/^\x02/ {
    print_trailers()
    print $0
    delete TRAILERS
}

match($0, /^([-_ A-Za-z0-9]+):\s+(.*)\s*/, M) {
    TRAILERS[M[1]][length(TRAILERS[M[1]])] = M[2]
}

END {
    print_trailers()
}

कुछ शब्द कैसे awkस्क्रिप्ट काम करते हैं:

  • यह मानता है कि रिकॉर्ड जिन्हें प्रसंस्करण की आवश्यकता नहीं है, वे STX से शुरू हो रहे हैं;
  • यह grepएक Key Name: Valueपैटर्न के लिए प्रत्येक गैर- "एसटीएक्स" लाइन की कोशिश करता है और प्रत्येक रिकॉर्ड के लिए पाया गया परिणाम अस्थायी सरणी TRAILERS(जो वास्तव में मल्टीमैप के रूप में कार्य करता है, जैसे Map<String, List<String>>जावा में) को बचाता है ;
  • प्रत्येक रिकॉर्ड के रूप में लिखा गया है, लेकिन नए रिकॉर्ड का पता लगाने से पहले या ईओएफ पर ट्रेलरों को लिखा जाता है।

2 संपादित करें (बेहतर awk)

खैर, मैं वास्तव में कमजोर हूं awk, इसलिए एक बार जब मैंने awkआंतरिक चर के बारे में अधिक पढ़ा, तो मुझे लगा कि awkस्क्रिप्ट पूरी तरह से फिर से कार्यान्वित की जा सकती है और टीएसवी जैसे आउटपुट का उपयोग करने के लिए किसी भी पोस्ट-प्रोसेसिंग के बिना sedया उसके साथ ही तैयार है perl। लिपि का छोटा और बेहतर संस्करण है:

#!/bin/bash

git log --pretty=format:'%x1E%h%x1F%an%x1F%ae%x1F%aD%x1F%s%x1F%B%x1E' \
    | gawk -f trailers.awk
#!/usr/bin/awk -f

BEGIN {
    RS = "\x1E"
    FS = "\x1F"
    OFS = "\x09"
}

function extract(array, trailer_key, __buffer) {
    for ( i in array ) {
        if ( index(array[i], trailer_key) > 0 ) {
            if ( length(__buffer) > 0 ) {
                __buffer = __buffer ","
            }
            __buffer = __buffer substr(array[i], length(trailer_key))
        }
    }
    return __buffer
}

NF > 1 {
    split($6, array, "\n")
    print $1, $2, $3, $4, $5, extract(array, "Reviewed By: "), extract(array, "Differential Revision: ")
}

बहुत अधिक संक्षिप्त, पढ़ने, समझने और बनाए रखने में आसान।