ट्रेलर विकल्प गिट - व्याख्या विकल्प में
मैं 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
में उपरोक्त सीवीएस आउटपुट में अंतिम स्थान पर पाठ होना चाहिए ।
जवाब
मुझे यकीन नहीं है लेकिन:
- ट्रेलर कुंजी में व्हाट्सएप नहीं हो सकता (इसलिए
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: ")
}
बहुत अधिक संक्षिप्त, पढ़ने, समझने और बनाए रखने में आसान।