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?
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:
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!
git ls-tree -r --name-only HEAD | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort
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 | sort
vào cuối:
git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | sort
Đâ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.)
Đâ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.
Đố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