क्या दिए गए कमिट के लिए पुश डेट प्राप्त करने का कोई तरीका है?


92

मैं सोच रहा था कि क्या गिट लॉग में प्रत्येक कमेटी के साथ जुड़ी एक पुश डेट देखने का कोई तरीका है। यदि यह संभव नहीं है, तो क्या एक निश्चित धक्का के तहत सभी कमिट्स को देखने का एक तरीका है।

मैं एक कार्यक्रम लिख रहा हूं, जिसे धकेलने के साथ कमिट्स का ट्रैक रखने की जरूरत है। चूँकि git लॉग कमिट डेट द्वारा ऑर्डर किया गया है, न कि पुश डेट, मैं सबसे हाल के कमिट्स को नहीं देख पा रहा हूँ जिन्हें पुश किया गया है। उदाहरण के लिए, यदि कोई उपयोगकर्ता अपने स्थानीय भंडार से 2 दिन पहले गुरु के पास जाता है, तो वह प्रतिबद्ध मास्टर रिपॉजिटरी लॉग में 2 दिनों के अन्य प्रतिबद्धों के पीछे रखा जाएगा।

जवाबों:


77

मुझे बिखरी जानकारी इकट्ठा करने और अंत में इस सवाल का सबसे अच्छा जवाब खोजने के लिए एक पागलपन भरा समय लगा, लेकिन अब मुझे पता है कि मेरे पास है। केवल दो लाइनों में, कोई कोड और कोई हुक नहीं:

# required for a bare repo
git config core.logAllRefUpdates true

git reflog --date=local master

पिछले पर सरल।

चेतावनी: आप शायद के मूलभूत मूल्यों ओवरराइड करना चाहते gc.reflogExpireऔर gc.reflogExpireUnreachablegit help reflogविवरण के लिए जांचें और यह समझने के लिए कि यह कैसे और क्यों काम करता है।

ऊपर दिए गए दो आदेशों को आपके द्वारा पुश किए गए क्लोन के अंदर चलाया जाना चाहिए । यदि यह संभव नहीं है तो एक सन्निकटन दूसरे, स्थायी क्लोन में चलना है :

git fetch               origin        # often and *regularly*
git reflog --date=local origin/master

इस स्थायी क्लोन को कभी न हटाएं या आप तिथियां खो देंगे।


2
मैं जोड़ना चाहूंगा कि मेरे मामले में मुझे पुश की सूची देखने के लिए git reflog --date=local origin/master(नोट origin/) करना था । अन्यथा केवल कमिट, चेकआउट और पुल सूची में थे (जो उपयोगी है, भी)। वास्तव में, मुझे @ जोनाथनडे के जवाब से सूचित किया गया था ।
एनआईए

@ एनआईए: मूल / मास्टर केवल आपको एक अनुमान देगा। मैंने आपकी टिप्पणी के बाद अपना उत्तर अपडेट कर दिया है, क्या यह स्पष्ट करता है?
मार्ख

37

गिट एक वितरित संस्करण नियंत्रण प्रणाली है, इसलिए आपको ध्यान से परिभाषित करना होगा कि "पुश डेट" से आपका क्या मतलब है। उदाहरण के लिए, मान लीजिए कि उपयोगकर्ता A, उपयोगकर्ता B के रिपॉजिटरी में कुछ पुश करता है। कुछ बिंदु बाद में, उपयोगकर्ता बी उन लोगों को एक तीसरे रिपॉजिटरी में भेजता है। आप किस तारीख में रुचि रखते हैं?

मैं अनुमान लगा रहा हूं कि आपके पास एक साझा भंडार है और चाहते हैं कि उस साझा भंडार के उपयोगकर्ता यह निर्धारित करने में सक्षम हों कि जब कुछ भंडार में प्रकाशित हुआ था। यदि यह सच है, तो आपको उस जानकारी को साझा भंडार में इकट्ठा करना होगा।

बुरी ख़बरें

दुर्भाग्य से, प्रतिबद्ध संदेशों के लिए तारीख को जोड़ने का कोई तरीका नहीं है। यह सभी प्रकार की समस्याओं के कारण कमिट आईडी (जो कि सामग्री का SHA1 हैश है) को बदल देगा।

अच्छी खबर

सौभाग्य से, Git में नोट्स नामक एक (अपेक्षाकृत नई) सुविधा है । यह सुविधा आपको मनमाने ढंग से पाठ भेजने के लिए अनुमति देती है, जो git logप्रदर्शित कर सकता है। नोट्स संपादित और दूसरों के साथ साझा किए जा सकते हैं।

आप नोटों की सुविधा का उपयोग कर सकते हैं "यह प्रतिबद्ध [तारीख] को प्राप्त हुआ था" संदेश प्रत्येक प्रतिबद्ध को संदेश के रूप में इसे साझा भंडार द्वारा प्राप्त किया गया है।

git help notesविवरण के लिए देखें।

तारीख कैसे दर्ज करें

यहाँ मेरा सुझाव है:

  1. post-receiveप्रत्येक अद्यतन संदर्भ के लिए प्रत्येक नए पहुंच योग्य चलने के लिए अपने साझा भंडार पर हुक को संशोधित करें ।
  2. प्रत्येक कमिट के लिए, "रिपॉजिटरी_र्ल" के "[उपयोगकर्ता] जैसे कुछ को जोड़ दें, इस कमेंट को [डेट] पर [रीफ] को कमिट के नोट में जोड़ दिया।

    आप refs/notes/received-onडिफ़ॉल्ट के बजाय इस उद्देश्य (जैसे ) को समर्पित नोट्स रेफरी का उपयोग करना चाह सकते हैं refs/notes/commits। यह अन्य उद्देश्यों के लिए बनाए गए नोटों के साथ संघर्ष को रोक देगा।

  3. receiveअपने नोट्स संदर्भों से अपडेट को अस्वीकार करने के लिए अपने हुक को संशोधित करें (उपयोगकर्ताओं को गलती से या जानबूझकर नोटों के साथ खिलवाड़ करने के लिए रखें)।
  4. सभी उपयोगकर्ताओं को उनके काम करने वाले पेड़ के अंदर से निम्न कमांड चलाने के लिए कहें:

    # Fetch all notes from the shared repository.
    # Assumes the shared repository remote is named 'origin'.
    git config --add remote.origin.fetch '+refs/notes/*:refs/remote-notes/origin/*'
    
    # Show all notes from the shared repository when running 'git log'
    git config --add notes.displayRef 'refs/remote-notes/origin/*'
    

    यह कदम आवश्यक है क्योंकि Git डिफ़ॉल्ट रूप से अपस्ट्रीम रिपॉजिटरी में गैर-शाखा, गैर-टैग संदर्भों को अनदेखा करता है।

उपरोक्त मानता है कि संदर्भ केवल उन्नत हैं, कभी हटाए नहीं गए या बल-अद्यतन नहीं किए गए हैं। आप शायद post-receiveइन मामलों को संभालने के लिए हुक को "[तारीख] को हटा दिया गया" नोट्स भी जोड़ना चाहते हैं ।


मैंने अपने विचार का उपयोग अपने ब्लॉग mnaoumov.wordpress.com/2013/01/31/git-get-push-date
mnaoumov

7
git reflog show origin/master --pretty='%h %gd %gs %s' --date=iso

यह मेरे लिए बहुत अच्छा काम करता है। कमिट डेट (% cd) भ्रामक है क्योंकि यह जरूरी नहीं है कि पुश डेट जैसी ही हो। --Date = iso विकल्प, हालांकि पुश / भ्रूण की तारीख को आउटपुट करेगा

ध्यान दें, यदि आपने मूल / मास्टर से प्राप्त किया है, तो यह आपके द्वारा प्राप्त की गई तारीख को प्रिंट करेगा; तारीख नहीं किसी और को प्रतिबद्ध धक्का दिया।

 - %h:  abrev. hash
 - %gd: human readable reflog selector
 - %gs: reflog subject
 - %s:  subject/commit message

बोनस: आप निश्चित रूप से, अधिक सुंदर स्वरूपण कर सकते हैं। अब तक, मुझे यह कलर कोडिंग पसंद है। यह हालांकि टाइप करने के लिए थोड़ा बहुत है। यह SHA को लाल में बदल देगा, चयनकर्ता को cyan में बदल देगा, और हरे के अधीन reflog कर देगा।

git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso

हाय वीसी का मतलब है कि अगर आउटपुट "reflog शो ओरिजिन / मास्टर - प्रॉजेक्टी = '% क्रेडिट% h% Creset -% C (पीला)% gd% Creset% Cblue (% gs)% Creset% s' - -date = iso "" da4c192cd -origin / master @ {2019-02-07 08:13:40 +0100} (पुल: फास्ट-फॉरवर्ड) JIRA-2542 परीक्षण रिपोर्ट बढ़ाएँ ", इसका मतलब है कि मेरी शाखा JIRA की सामग्री -2542 2019-02-07 08:13:40 पर एक फास्ट-फ्राड के माध्यम से मूल / मास्टर पर विलय कर दिया गया था?
साइमन

हाय साइमन, हाँ। आपने अपनी शाखा पर एक खिंचाव खींचा और यह उस समय तेजी से आगे के माध्यम से मूल / मास्टर में विलय कर दिया गया था।
कुलपति

यह केवल लेखक के भंडार पर काम करता है। यदि मैं एक रिपॉजिटरी क्लोन करता हूं, तो मान खाली है। आप अन्य लोगों के पुश समय को नहीं देख सकते।
रामविनय

6

देख लेना git reflog show master। संभवत: सटीक प्रारूप नहीं जिसे आप चाहते हैं, लेकिन आपको सही दिशा में इंगित करना चाहिए।

एक अन्य विचार एक स्क्रिप्ट को पुश हुक के अंदर चला रहा है।


मैंने पुश हुक चलाने के बारे में सोचा, लेकिन ऐसा लगता है कि अंतिम प्रयास होना चाहिए। हुक के साथ ऐसा लगता है कि प्रत्येक उपयोगकर्ता को अपने प्रत्येक रिपॉजिटरी में उस हुक को रखना होगा। क्या आप इसके बारे में अधिक विशिष्ट हो सकते हैं git reflog show master? मैं हर उपयोगकर्ता की व्यक्तिगत प्रतिबद्धताओं की पुश तिथि को देखने में सक्षम होना चाहता हूं।
Justkikuchi

git reflog में जो भी आप इसे चलाते हैं, उसमें परिवर्तन के क्रम को दिखाता है। मुझे यकीन नहीं है कि तिथि प्राप्त करने का एक सीधा तरीका है, लेकिन .git/logs/refs/heads/masterइसमें टाइमस्टैम्प दिखाई देता है।
कार्ल बेज़ेलफेल्ट

3
हुक के रूप में, ऐसे हुक प्राप्त होते हैं जो उस मशीन पर चलते हैं जिसे आप धक्का देते हैं । चूंकि धक्का एक विशिष्ट रेपो के सापेक्ष केवल प्रासंगिक है, इसलिए मैं मान रहा हूं कि आपके पास इसे चलाने के लिए एक निश्चित "धन्य" रेपो है। वही git reflogउस मामले के लिए जाता है।
कार्ल बेज़ेलफेल्ट

5

रिमोट पर रिफ्लॉग का निरीक्षण करने के बारे में यह उत्तर आपको ( https://stackoverflow.com/a/8791295/336905 ) जानकारी प्रदान कर सकता है, जिस पर एक शाखा को धक्का दिया गया था, यहां तक ​​कि इसके माध्यम से यह भी नहीं दिखाया गया था कि कौन धक्का दिया था, लेकिन आप स्थानीय प्रतिबद्ध तारीख के बाद अगला धक्का पाकर क्रॉस-सहसंबंधी हो सकता है। यदि आप पहले ही पोस्ट किए गए @RichardHansen से उत्कृष्ट नोट्स सुझाव को लागू नहीं कर पाए हैं, तो मूर्ख-प्रूफ नहीं, बल्कि आसान


1
एक नोट के साथ जो origin/branchकेवल वर्तमान मशीन पर किए गए परिवर्तनों को दिखाएगा , यह बेहद उपयोगी है! दिन-प्रतिदिन के उपयोग के लिए मैं किसी भी हुक को लागू नहीं करना चाहता, इसलिए एक साधारण प्रश्न के लिए "हम्म, जब मैंने पिछले सप्ताह प्रतिबद्ध किया था?" - यह बहुत अच्छा काम करता है।
एनआईए

4

आप सर्वर पर खुद ही गिट रिपॉजिटरी में "ऑब्जेक्ट्स" डायरेक्टरी में कमिट ऑब्जेक्ट फाइल के फाइल मॉडिफिकेशन टाइम को भी देख सकते हैं।


3

Git AuthorDate, वचन-पत्र से अलग क्यों है?

  • AuthorDate जब पहली बार प्रतिबद्ध बनाया गया था।
  • CommitDate जब कमिट को पिछली बार संशोधित किया गया था (जैसे रिबेस)।

आप उन्हें --prettyस्वरूपण विकल्पों के साथ प्राप्त कर सकते हैं :

       o    %cd: committer date
       o    %cD: committer date, RFC2822 style
       o    %cr: committer date, relative
       o    %ct: committer date, UNIX timestamp
       o    %ci: committer date, ISO 8601 format

इसलिए, यदि आप और अन्य डेवलपर्स git rebaseपहले कर रहे हैं git push, तो आप एक प्रतिबद्ध तारीख के साथ समाप्त हो जाएंगे जो कि लेखक की तारीख से बाद में है ।

यह आदेश प्रतिबद्ध दिनांक दिखाता है: git log --pretty=fuller


1

मुझे लगता है कि आप पुश तिथि प्राप्त करने के लिए अगली नोटेशन का उपयोग कर सकते हैं: git log -g --date = स्थानीय

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.