Cách truy xuất ngày sửa đổi cuối cùng của tất cả các tệp trong kho git


64

Tôi biết cách truy xuất ngày sửa đổi cuối cùng của một tệp trong kho git:

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

Có cách nào đơn giản và hiệu quả để làm tương tự cho tất cả các tệp hiện có trong kho không?

Câu trả lời:


74

Một câu trả lời đơn giản sẽ là lặp qua từng tệp và hiển thị thời gian sửa đổi của nó, tức là:

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

Điều này sẽ mang lại sản lượng như vậy:

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

Rõ ràng, bạn có thể kiểm soát điều này vì nó chỉ là một tập lệnh bash vào thời điểm này - vì vậy hãy thoải mái tùy chỉnh nội dung trái tim của bạn!


2
Tôi đã hy vọng rằng có một tùy chọn để có được đầu ra kết hợp trong một lần chạy nhật ký git, nhưng câu trả lời của bạn tốt hơn so với câu hỏi tôi có trong đầu khi sử dụng find. Tôi không biết git-ls-tree, có lợi thế là chỉ liệt kê các tệp được lưu trữ trong kho lưu trữ, bỏ qua thư mục .git và các tệp bị bỏ qua. Cảm ơn.
Eric Bréchemier

Không sao, Eric; bạn đang đi theo cùng một lộ trình mà tôi đã làm - tức là, tìm và bỏ qua thư mục .git! :) Có thể có một số tùy chọn sử dụng lệnh git ống nước, nhưng khá thẳng thắn, điều này hoạt động khá tốt. Nếu bạn có thể tìm cách nào đó để có được thông tin trên cơ sở từng tệp một lúc, điều đó sẽ hoạt động tốt nhất - nhưng hãy nhớ, git hoạt động ở trạng thái cam kết, chứ không phải trạng thái của các tệp riêng lẻ.
Andrew M.

11
Tôi khuyên bạn nên sử dụng --format = "% ai" nếu bạn muốn tem thời gian có thể sắp xếp thay vì ngày có thể đọc được của con người.
ThorSummoner

2
Vì "ĐẦU" chỉ là một tài liệu tham khảo, bạn có thể sử dụng bất kỳ tài liệu tham khảo nào bạn muốn, có thể là thẻ, chi nhánh, cam kết băm, v.v.
Andrew M.

1
như @ThorSummoner đã nói, sử dụng định dạng% ai cho ngày và sau đó chỉ cần đặt ống để sắp xếp để sắp xếp kết quả:git ls-tree -r --name-only HEAD | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort
John Hunt

21

Cách tiếp cận này cũng hoạt động với tên tệp có chứa khoảng trắng:

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

Ví dụ đầu ra:

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
...

Đầu ra có thể được sắp xếp bằng dấu thời gian sửa đổi bằng cách thêm | sortvào cuối:

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

Bất kỳ cách nào để có được điều này được sắp xếp bằng dấu thời gian sửa đổi?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina: Chỉ cần thêm `| sắp xếp đến cuối lệnh.
dotancohen

2
Điều này hoạt động nhưng mất một thời gian loooong ...
Guillhol

5

Đây là một điều chỉnh nhỏ trong câu trả lời của Andrew M. (Tôi không thể bình luận về câu trả lời của anh ấy.)

Gói tên tệp $ đầu tiên trong dấu ngoặc kép , để hỗ trợ tên tệp có dấu cách được nhúng.

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

Đầu ra mẫu:

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

Tôi đánh giá cao giải pháp của Andrew (dựa trên ls-tree ) hoạt động với kho lưu trữ trần! (Điều này không đúng với các giải pháp sử dụng tệp ls.)


Bạn cũng có thể bỏ qua echo: git log -1 --format = "% ad $ filename"
Kevin Lyda

0

Đây là phiên bản vỏ cá của câu trả lời của Andrew M, dành cho những người sử dụng cá.

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

Tôi lưu trữ này như là một chức năng cá để dễ dàng truy cập.


0

Đối với những người trong chúng ta sử dụng Windows và PowerShell, câu trả lời của Andrew M, với tinh chỉnh có thể đọc được trên máy tính:

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

Ví dụ đầu ra:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.