Làm thế nào để có được git để hiển thị cam kết trong một phạm vi ngày cụ thể cho ngày tác giả?


Câu trả lời:


39

Bạn không thể — ít nhất, không phải trong Git một mình. (Nhắc nhở những người đang truy cập câu hỏi này: không phải để xem ngày tác giả, mà là chọn cam kết theo ngày tác giả, một la --since/ --after--until/ --before. Những bộ chọn này sử dụng ngày cam kết , không phải ngày tác giả. Hãy coi như một ví dụ điển hình về cam kết được thực hiện "bây giờ", để ngày cam kết của nó là vào những năm 2000, nhưng được lùi lại trong trường ngày tác giả thành một ngày nào đó trong năm 1999. Nếu phạm vi lựa chọn của bạn là "bất kỳ lúc nào gần bước sang thế kỷ", bạn sẽ bỏ -chọn cam kết này, vì ngày cam kết của nó là "bây giờ", hơn một thập kỷ sau năm 1999.)

Tôi coi đây là một lỗi nhỏ trong Git: bạn có thể yêu cầu nó sử dụng trường ngày tác giả ở bất kỳ đâu bạn có thể yêu cầu nó sử dụng trường ngày của người xác nhận. Đây là cách dễ dàng với định dạng log , vì chúng ta có %ad%cdvà những thứ tương tự, nhưng không thể với cam kết lựa chọn . Gần nhất mà chúng tôi có là git rev-listcó thể sắp xếp theo ngày tác giả (trong phân loại topo chung).

Một công tắc toàn cầu git rev-list, giống như --use-author-date, sẽ hoạt động như một bản vá đơn giản và sẽ không quá khó để thêm vào Git, nhưng tôi nghĩ sẽ tốt hơn nếu có --min-author-age--max-author-agehoặc tương tự, và một cờ "sắp xếp theo ngày của tác giả" (độc lập với --topo-ordercờ chung , do đó việc đặt cả hai cờ có cùng tác dụng như --author-date-order).

Để giải quyết vấn đề này, bạn có thể liệt kê tất cả các cam kết có khả năng thú vị (với git rev-listhoặc tương đương, chẳng hạn như git log: sử dụng bất kỳ công cụ chỉ định nào khiến các cam kết có thể thú vị, ngoại trừ bộ lọc ngày: trong trường hợp này chỉ là --all) và trích xuất tất cả các trường ngày tác giả của chúng (với git log --format=%athoặc bất cứ điều gì), sau đó tự cắt danh sách các ID cam kết, sau đó gửi lại các ID cam kết còn lại git log --no-walk. Nhưng điều này là đau đớn nhất. Xem câu trả lời của Tim Beigeleisen bằng awk để biết thêm.


Cảm ơn quyền hạn của bạn đã giải quyết sự nhầm lẫn cho tôi - điều này đã làm tôi khó chịu từ lâu và tôi đã dành rất nhiều thời gian để lướt qua các trang người dùng để thử và tìm công tắc không tồn tại. Có một lỗi đã được mở cho điều này?
Mr_and_Mrs_D

Tôi không biết những người Git có coi đây là một lỗi không. Xem github.com/git/git để biết liên kết đến danh sách gửi thư.

120

Có lẽ tôi đang thiếu một cái gì đó, nhưng điều này sẽ không đủ sao?

git log --pretty=format:"%ad - %an: %s" --after="2016-01-31" --until="2017-03-10" --author="John Doe"

Xem thêm tại đây


18
@RossSolomon: hiển thị ngày của tác giả, nhưng chọn theo ngày của người cam kết. Để lấy một ví dụ điển hình, giả sử tôi thực hiện một cam kết với ngày tác giả được đặt thành 1999 và ngày cam kết được đặt thành 01-01-2017. Các %adchỉ thị sẽ cho bạn thấy cách tác giả trong năm 1999 cam kết, mặc dù đó là điều này trước 2016!
torek

7
"Có lẽ tôi đang thiếu một cái gì đó" Vâng, toàn bộ ý của câu hỏi. Điều này sử dụng cùng một phương pháp lọc như OP, dựa trên ngày cam kết, nhưng chỉ hiển thị ngày của tác giả sau khi đã lọc ra những gì họ muốn. Làm thế nào mà 18 người có khả năng đọc hiểu kém như vậy?
underscore_d

Lệnh đó không hoạt động với định dạng ngày iso-8601 ở - trước và - sau. Định dạng phù hợp với tôi là "dd-mm-ccyy".
hktegner

8
Từ chối vì câu trả lời này không giải quyết được câu hỏi, mặc dù nói chung là hữu ích.
ravron

2
Ngay cả khi nó không trả lời câu hỏi, nếu tôi tình cờ tìm thấy câu trả lời này và tìm ra giải pháp cho vấn đề tương tự nhưng không giống nhau của mình , tôi sẽ ủng hộ câu trả lời, đơn giản như vậy. Tuy nhiên, điều này không có nghĩa là câu trả lời nên được chấp nhận, và tôi hiểu ai đó đã phản đối nó.
Mefitico

30

Bạn có thể .

Nhưng như @torek đã đề cập, bạn có thể không làm được điều này với Git thuần túy. Một tùy chọn sẽ là chuyển một số đầu ra có định dạng đẹp từ git logvào awkvà kiểm tra ngày tác giả ở đó:

git log --date=iso --pretty=format:'%ad%x08%aN' | awk '$0 >= "2013-01-01" && $0 <= "2013-12-01"'

Ở đây, %adcho biết ngày của tác giả ở định dạng ISO và %aNcho biết tên tác giả.


1
Cảm ơn - Tôi đã đi trước và chấp nhận câu trả lời Torek như bạn toàn diện hơn nhưng upvoted đã cho một điểm bắt đầu :)
Mr_and_Mrs_D

2

lấy cảm hứng từ câu trả lời của Tim Biegeleisen ở trên.

git log --all --date=iso --pretty=format:'%ad%x08%aN %s' | grep 2020-06-09 | sort -u

đã làm những gì tôi cần. Tôi muốn ngày của tác giả, không phải ngày cam kết bởi vì tôi rebase và bóp méo rất nhiều. nhưng tôi giữ những ngày quan trọng về cam kết nhập khẩu.

liên quan đến điều đó, tôi có một người trợ giúp nhỏ cho phép tôi đặt lại email của tác giả nhưng giữ nguyên ngày của tác giả gốc. --reset-author theo mặc định ghi đè ngày của tác giả.

https://github.com/mathieujobin/git-scripts/blob/master/bin/git-reset-author-but-not-date

trên git log ở trên, khi cần, bạn có thể thêm %Hvào để lấy gitsha


1
% x08 ở định dạng đẹp có nghĩa là ascii 08 là backspace, vì vậy nó ăn chữ số cuối cùng của% quảng cáo trước đó là ngày của tác giả ở định dạng ISO, vì vậy tôi sử dụng biến thể này (cũng được thêm dấu hai chấm sau tên tác giả):git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u
diseaseo
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.