গিট সংগ্রহস্থলের সমস্ত ফাইলের সর্বশেষ পরিবর্তনের তারিখটি কীভাবে পুনরুদ্ধার করবেন


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 ফোল্ডারটি এড়িয়ে যাওয়া এবং উপেক্ষা করা ফাইলগুলি রয়েছে। ধন্যবাদ।
এরিক ব্রচেমিয়ার

সমস্যা নেই, এরিক; আপনি আমি একই পথে অনুসরণ করে চলেছি - অর্থাত্ .git ডিরেক্টরিটি অনুসন্ধান এবং উপেক্ষা করে! :) গিট নদীর গভীরতানির্ণয় কমান্ড ব্যবহার করে কিছু বিকল্প থাকতে পারে, তবে বেশ স্পষ্টভাবে, এটি বেশ ভালভাবে কাজ করে। আপনি যদি একবারে ফাইলের ভিত্তিতে একসাথে তথ্য পাওয়ার কোনও উপায় খুঁজে পান তবে এটি সবচেয়ে ভাল কাজ করবে - তবে মনে রাখবেন, গিটটি পৃথক ফাইলের রাজ্যে নয়, কমিটের রাজ্যে কাজ করে।
অ্যান্ড্রু এম

11
যদি আপনি মানব পাঠযোগ্য তারিখের পরিবর্তে বাছাইযোগ্য টাইম স্ট্যাম্পগুলি চান তবে আমি ফর্ম্যাট = "% আইআই" ব্যবহার করার পরামর্শ দিচ্ছি।
থারস্মমনার

2
যেহেতু "মাথা" শুধু একটি রেফারেন্স হয়, তাহলে আপনি হ্যাশ, ইত্যাদি .. কোন রেফারেন্স যদি আপনি চান ব্যবহার করতে পারেন, এটি একটি ট্যাগ, শাখা হতে কমিট
অ্যান্ড্রু এম

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
@ আমেলিওভাজ্কেজ-রেইনা: কেবল যুক্ত করুন `| কমান্ডের শেষে বাছাই করুন।
dotancohen

2
এটি কাজ করে তবে একটি দীর্ঘ সময় নেয় ...
গিলোকন

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

আমি প্রশংসা করি যে অ্যান্ড্রু এর সমাধান ( এলএস-ট্রি উপর ভিত্তি করে ) খালি সংগ্রহস্থলগুলির সাথে কাজ করে! (এটি এলএস-ফাইলগুলি ব্যবহার করে সমাধানগুলির ক্ষেত্রে সত্য নয়))


আপনি প্রতিধ্বনি এড়িয়ে যেতে পারেন: গিট লগ -১ - ফর্ম্যাট = "% বিজ্ঞাপন $ ফাইলের নাম"
কেভিন লিয়দা

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

আমরা যারা উইন্ডোজ এবং পাওয়ারশেল ব্যবহার করছি তাদের জন্য, কম্পিউটার পাঠযোগ্য তাত্পর্য সহ অ্যান্ড্রু এম এর উত্তর:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.