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


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

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

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


49
2018-06-22 19:41


मूल




जवाब:


एक साधारण जवाब प्रत्येक फ़ाइल के माध्यम से पुनरावृत्त करना होगा और इसके संशोधन समय को प्रदर्शित करना होगा, यानी।

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

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


60
2018-06-22 20:10



मैं उम्मीद कर रहा था कि गिट लॉग के एक रन में संयुक्त आउटपुट प्राप्त करने का एक विकल्प था, लेकिन आपका जवाब ढूंढने के द्वारा दिमाग में मेरे मुकाबले बेहतर है। मुझे गिट-एलएस-पेड़ नहीं पता था, जिसमें केवल भंडार में संग्रहीत फ़ाइलों को सूचीबद्ध करने का लाभ है, .git फ़ोल्डर को छोड़कर और अनदेखा फाइलें। धन्यवाद। - Eric Bréchemier
कोई समस्या नहीं, एरिक; आप उसी मार्ग का पालन कर रहे हैं जो मैंने किया - यानी, .git निर्देशिका को ढूंढकर अनदेखा कर रहा है! :) गिट प्लंबिंग कमांड का उपयोग करके कुछ विकल्प हो सकते हैं, लेकिन काफी स्पष्ट रूप से, यह बहुत अच्छी तरह से काम करता है। यदि आप प्रति फ़ाइल आधार पर जानकारी प्राप्त करने के लिए कुछ रास्ता ढूंढ सकते हैं, तो यह सबसे अच्छा काम करेगा - लेकिन याद रखें, गिट काम की स्थिति पर काम करता है, व्यक्तिगत फाइलों की स्थिति नहीं। - Andrew M.
क्या इसे वर्तमान चेकआउट हेड के अलावा किसी अन्य प्रतिबद्धता पर काम करने के लिए अनुकूलित किया जा सकता है? मुझे लगता है कि लॉग कमांड डिफ़ॉल्ट रूप से हेड के सापेक्ष काम कर रहा है। - ThorSummoner
यदि आप मानव पठनीय तिथियों के बजाय क्रमबद्ध समय टिकटें चाहते हैं तो मैं --format = "% ai" का उपयोग करने की अनुशंसा करता हूं। - ThorSummoner
चूंकि "हेड" सिर्फ एक संदर्भ है, आप किसी भी संदर्भ का उपयोग कर सकते हैं, चाहे वह एक टैग हो, शाखा हो, प्रतिबद्ध हैश इत्यादि। - Andrew M.


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

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

14
2018-05-03 15:35



संशोधन टाइमस्टैम्प द्वारा क्रमबद्ध करने के लिए कोई तरीका? - Amelio Vazquez-Reina
@ अमेलियोवाज़्यूज़-रीना: बस '| जोड़ें आदेश के अंत तक क्रमबद्ध करें। - dotancohen
यह काम करता है लेकिन एक बहुत समय लगता है ... - Guillochon


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

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

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-वृक्ष) नंगे भंडार के साथ काम करता है! (यह ls-files का उपयोग कर समाधानों के बारे में सच नहीं है।)


2
2018-06-21 18:15



आप इको को भी छोड़ सकते हैं: गिट लॉग -1 --format = "% ad $ filename" - Kevin Lyda


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

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

मैं इसे आसान पहुंच के लिए एक मछली समारोह के रूप में स्टोर करता हूं।


0
2018-03-09 16:28