गिट रिपॉजिटरी में सभी फाइलों की अंतिम संशोधन तिथि कैसे प्राप्त करें


64

मुझे पता है कि एक गिट रिपॉजिटरी में किसी एकल फ़ाइल की अंतिम संशोधन तिथि कैसे प्राप्त करें:

git log -1 --format="%ad" -- path/to/file

क्या रिपॉजिटरी में वर्तमान में मौजूद सभी फाइलों के लिए एक सरल और कुशल तरीका है?

जवाबों:


74

एक सरल उत्तर प्रत्येक फ़ाइल के माध्यम से पुनरावृत्ति करना और उसके संशोधन समय को प्रदर्शित करना होगा, अर्थात:

git ls-tree -r --name-only HEAD | while read filename; do
  echo "$(git log -1 --format="%ad" -- $filename) $filename"
done

इस तरह उत्पादन होगा:

Fri Dec 23 19:01:01 2011 +0000 Config
Fri Dec 23 19:01:01 2011 +0000 Makefile

जाहिर है, आप इसे इस बिंदु पर सिर्फ एक बैश स्क्रिप्ट के बाद से नियंत्रित कर सकते हैं - इसलिए अपने दिल की सामग्री को अनुकूलित करने के लिए स्वतंत्र महसूस करें!


2
मैं उम्मीद कर रहा था कि गिट लॉग के एक रन में एक संयुक्त आउटपुट प्राप्त करने का एक विकल्प था, लेकिन आपका उत्तर उस खोज से बेहतर है जिसे मैंने खोजा था। मैं git-ls- ट्री को नहीं जानता था, जिसमें रिपॉजिटरी में संग्रहित फाइलों को सूचीबद्ध करने का फायदा है।। धन्यवाद।
एरिक ब्रेकेमियर

कोई समस्या नहीं, एरिक; आप उसी मार्ग का अनुसरण कर रहे हैं जो मैंने किया था - अर्थात, .IT निर्देशिका की खोज और अनदेखी करना! :) गिट प्लमिंग कमांड का उपयोग करके कुछ विकल्प हो सकते हैं, लेकिन काफी स्पष्ट रूप से, यह बहुत अच्छी तरह से काम करता है। यदि आप एक बार में फ़ाइल के आधार पर जानकारी प्राप्त करने का कोई तरीका पा सकते हैं, तो यह सबसे अच्छा काम करेगा - लेकिन याद रखें, git कमिट की स्थिति पर काम करता है, न कि व्यक्तिगत फ़ाइलों की स्थिति पर।
एंड्रयू एम।

11
यदि आप मानव पठनीय तारीखों के बजाय छांटने योग्य समय के स्टैम्प चाहते हैं - मैं --फॉर्म = "% एआई" का उपयोग करने की सलाह देता हूं।
थोरसुमोनर

2
चूँकि "HEAD" केवल एक संदर्भ है, आप अपनी इच्छानुसार किसी भी संदर्भ का उपयोग कर सकते हैं, यह एक टैग, शाखा, कमिट हैश इत्यादि हो सकता है।
एंड्रयू एम।

1
जैसा कि @ थोरसुमोनर ने कहा, तारीख के लिए% ai प्रारूप का उपयोग करें, और फिर परिणाम को सॉर्ट करने के लिए बस पाइप करें:git ls-tree -r --name-only HEAD | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort
जॉन हंट

21

यह दृष्टिकोण उन फ़ाइल नाम के साथ भी काम करता है जिनमें रिक्त स्थान होते हैं:

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {}

उदाहरण आउटपुट:

2015-11-03 10:51:16 -0500 .gitignore
2016-03-30 11:50:05 -0400 .htaccess
2015-02-18 12:20:26 -0500 .travis.yml
2016-04-29 09:19:24 +0800 2016-01-13-Atlanta.md
2016-04-29 09:29:10 +0800 2016-03-03-Elmherst.md
2016-04-29 09:41:20 +0800 2016-03-03-Milford.md
2016-04-29 08:15:19 +0800 2016-03-06-Clayton.md
2016-04-29 01:20:01 +0800 2016-03-14-Richmond.md
2016-04-29 09:49:06 +0800 3/8/2016-Clayton.md
2015-08-26 16:19:56 -0400 404.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-bradycardia-algorithm.htm
2015-12-23 17:03:51 -0500 _algorithms/acls-pulseless-arrest-algorithm-asystole.htm
2016-04-11 15:00:42 -0400 _algorithms/acls-pulseless-arrest-algorithm-pea.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-secondary-survey.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-suspected-stroke-algorithm.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-tachycardia-algorithm-stable.htm
...

उत्पादन | sortको अंत में जोड़कर संशोधन टाइमस्टैम्प द्वारा हल किया जा सकता है :

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | sort

किसी भी तरह यह संशोधन टाइमस्टैम्प द्वारा हल किया जा सकता है?
अमिलियो वाज़केज़-रीना

1
@ AmelioVazquez-Reina: बस जोड़ें `| आदेश के अंत में क्रमबद्ध करें।
dotancohen

2
यह काम करता है लेकिन एक loooong समय लेता है ...
गिलोचोन

5

यह एंड्रयू एम के जवाब का एक छोटा सा ट्वीक है। (मैं उनके जवाब पर टिप्पणी करने में असमर्थ था।)

एम्बेड किए गए रिक्त स्थान के साथ फ़ाइलनाम का समर्थन करने के लिए, दोहरे उद्धरणों में पहला $ फ़ाइल नाम लपेटें

git ls-tree -r --name-only HEAD | while read filename; do
    echo "$(git log -1 --format="%ad" -- "$filename") $filename"
done

नमूना उत्पादन:

Tue Jun 21 11:38:43 2016 -0600 subdir/this is a filename with spaces.txt

मैं सराहना करता हूं कि एंड्रयू का समाधान ( एलएस-ट्री पर आधारित ) नंगे रिपोजिटरी के साथ काम करता है! (यह ls-files का उपयोग करके समाधानों का सच नहीं है।)


आप प्रतिध्वनि को भी छोड़ सकते हैं: git log -1 --format = "% ad $ filename"
केविन लिडा

0

एंड्रयू एम के जवाब का मछली खोल संस्करण है, उन लोगों के लिए जो मछली का उपयोग करते हैं।

git ls-tree -r --name-only HEAD | while read -l filename
    printf '%s %s\n' (git log -1 --format="%ai" -- $filename) $filename
end

मैं इसे आसान पहुंच के लिए फिश फंक्शन के रूप में संग्रहीत करता हूं।


0

Windows और PowerShell का उपयोग करने वाले हम लोगों के लिए, एंड्रयू एम का जवाब, कंप्यूटर पढ़ने योग्य ट्वीक के साथ:

git ls-tree -r --name-only HEAD | ForEach-Object { "$(git log -1 --format="%ai" -- "$_")`t$_" }

उदाहरण आउटपुट:

2019-05-07 12:00:37 -0500   .editorconfig
2016-07-13 14:03:49 -0500   .gitattributes
2019-05-07 12:00:37 -0500   .gitignore
2018-02-03 22:01:17 -0600   .mailmap
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.