Làm thế nào để git log - kể từ khi đếm?


85

Tôi có một kho lưu trữ thử nghiệm đơn giản chỉ với một số cam kết và muốn xem nhật ký được lọc ngày và giờ:

$ git log --author = "automatix" --since = "2013-01-30" --pretty - thử nghiệm
cam kết ea0719bef142659fa561c9d040b2120012ed0184
Ngày: Thứ Năm 31 tháng 1 02:03:12 2013 +0100

cam kết ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Ngày: Thứ Năm 31 tháng 1 01:59:11 2013 +0100

cam kết a0b027beba2cd03571bb9475b9db9542f8efe990
Ngày: Thứ Năm 31 tháng 1 01:50:38 2013 +0100

cam kết add77c8fe2ba9254c11b98e14facede3420dc51c
Ngày: Thứ Năm 31 tháng 1 01:48:34 2013 +0100

cam kết e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Ngày: Thứ Năm 31 tháng 1 01:46:27 2013 +0100

cam kết 8c286391e54d3fc1e210950b1320fd6f013a8f84
Ngày: Thứ Năm 31 tháng 1 01:41:27 2013 +0100

cam kết 9c880595e57f717383796fa2940f41f0f42f7e2a
Ngày: Thứ Năm 31 tháng 1 01:38:17 2013 +0100

cam kết a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Ngày: Thứ Năm 31 tháng 1 01:30:00 2013 +0100

Cam kết được chọn đầu tiên là a95527f36a533e1ecba1aadceea31a9dcbe1a8dbtừ 2013-01-30 01:30:00. 8 cam kết được chọn:

$ git log --author = "automatix" --since = "2013-01-30" --format = oneline - test | wc
      8 34 498

ĐỒNG Ý. Bây giờ tôi chọn kể từ 2013-01-31:

$ git log --author = "automatix" --since = "2013-01-31" --format = oneline - test | wc
      0 0 0

Gì? Ok, điều đó có nghĩa là sincequy tắc loại trừ các cam kết của ngày bắt đầu. Đúng?

Nhưng hãy tiếp tục:

$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --pretty - test
cam kết ea0719bef142659fa561c9d040b2120012ed0184
Ngày: Thứ Năm 31 tháng 1 02:03:12 2013 +0100

cam kết ab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
Ngày: Thứ Năm 31 tháng 1 01:59:11 2013 +0100

cam kết a0b027beba2cd03571bb9475b9db9542f8efe990
Ngày: Thứ Năm 31 tháng 1 01:50:38 2013 +0100

cam kết add77c8fe2ba9254c11b98e14facede3420dc51c
Ngày: Thứ Năm 31 tháng 1 01:48:34 2013 +0100

cam kết e6e323c05d37c74fcabeb9186b95c0d49b862e6f
Ngày: Thứ Năm 31 tháng 1 01:46:27 2013 +0100

cam kết 8c286391e54d3fc1e210950b1320fd6f013a8f84
Ngày: Thứ Năm 31 tháng 1 01:41:27 2013 +0100

cam kết 9c880595e57f717383796fa2940f41f0f42f7e2a
Ngày: Thứ Năm 31 tháng 1 01:38:17 2013 +0100

cam kết a95527f36a533e1ecba1aadceea31a9dcbe1a8db
Ngày: Thứ Năm 31 tháng 1 01:30:00 2013 +0100
$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --format = oneline - test | wc
      8 34 498

Bây giờ, khi tôi viết thời gian bắt đầu, các cam kết về thời gian bắt đầu cũng được bao gồm .

Tôi không hiểu logic. Ai có thể giải thích, tại sao nó hoạt động kỳ lạ như vậy?

Cảm ơn


1
thực sự rất thú vị .. đối với tôi nó có ý nghĩa nếu khi bạn chỉ cung cấp một ngày mà không có thời gian, nó được mặc định là giây cuối cùng trong ngày .. nhưng đó chỉ là điều tôi đang cố gắng. Cảm ơn vì đã đăng bài này. Rất thú vị!
Ilan berci

1
Vâng, có vẻ như vậy, nó không có thời gian nó mặc định là giây cuối cùng trong ngày. Stange, nhưng không vấn đề gì. Nhưng sau đó Git nên làm tương tự, khi thời gian không tính giây được cung cấp. Vì vậy, kết quả của git log --author="automatix" --since="2013-01-31 01:30" --pretty -- test nên nội dung 7 cam kết. Nhưng nó nội dung 8. git log --author="automatix" --since="2013-01-31 01:30" --format=oneline -- test | wc=> 8 34 498
Automatix

Tôi không đồng ý. Khi tôi nói “… xảy ra sau Thứ Hai”, ý tôi là “xảy ra sau giây cuối cùng của Thứ Hai” - “Thứ Hai” là viết tắt của khoảng thời gian 24h. Trong khi khi tôi nói “xảy ra sau 9 giờ”, ý tôi là “xảy ra sau 9 giờ 00: 00.0000” - “9 giờ” là một thời điểm, không phải khoảng thời gian. Giải thích của Git có ý nghĩa nhất.
Chronial,

2
Đó là một điểm tốt. Tôi sẽ nói, logic này chỉ hoạt động với "sau" - không phải với "kể từ". Nhưng trong Git các từ khóa "kể từ" anf "sau" là từ đồng nghĩa (tôi thấy nó bẩn về mặt ngôn ngữ). git-scm.com/book/en/…
automatix

Câu trả lời:


135

Trong trường hợp nó giúp ích cho người khác đến đây như tôi đã làm, sau khi nghiên cứu một chút, tôi phát hiện ra rằng việc sử dụng định dạng ISO8601 cũng hoạt động:

git log --since="2014-02-12T16:36:00-07:00"

Điều này sẽ cung cấp cho bạn độ chính xác đến giây. Lưu ý: bạn cũng có thể sử dụng:

git log --after="2014-02-12T16:36:00-07:00"
git log --before="2014-02-12T16:36:00-07:00"
git log --since="1 month ago"
git log --since="2 weeks 3 days 2 hours 30 minutes 59 seconds ago"

Vân vân.

Tất nhiên, điều này không "giải thích tại sao nó hoạt động kỳ lạ như vậy." Tuy nhiên, nó chắc chắn đã giải quyết được vấn đề cho tôi.


BIÊN TẬP:

Sau khi nghiên cứu kỹ hơn một chút, tôi đã phát hiện ra "tại sao nó hoạt động kỳ lạ như vậy":
Hóa ra là khi bạn không chỉ định định dạng ngày tháng, git log sẽ mặc định thành múi giờ của tác giả hoặc ngày cam kết , có nghĩa là đối với hành vi nhất quán, nó rất hữu ích để khai báo định dạng ngày của bạn một cách rõ ràng như sau:

git log --date=local

Cuối cùng, khi bạn không chỉ định thời gian, nó sẽ mặc định là giờ địa phương của bạn khi bạn chạy lệnh.

Truyện dài ngắn, cụ thể nên giải quyết được vấn đề:

git log --date=local --after="2014-02-12T16:36:00-07:00"

Ngoài ra, bạn có thể đặt định dạng ngày mặc định vĩnh viễn bằng lệnh sau:

git config log.date local

bạn có thể sử dụng bất kỳ giá trị nào sau đây: (relative|local|default|iso|rfc|short|raw)

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.