Rõ ràng điều này :
git log --all --after="<date> 00:00" --before="<date> 23:59" --author="<author>"
bộ lọc cam kết dựa trên ngày cam kết . Làm cách nào để tôi có thể hiển thị cam kết cho một phạm vi ngày tác giả cụ thể?
Rõ ràng điều này :
git log --all --after="<date> 00:00" --before="<date> 23:59" --author="<author>"
bộ lọc cam kết dựa trên ngày cam kết . Làm cách nào để tôi có thể hiển thị cam kết cho một phạm vi ngày tác giả cụ thể?
Câu trả lời:
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
và --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
và %cd
và 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-list
có 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
và --max-author-age
hoặ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-order
cờ 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-list
hoặ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=%at
hoặ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ó 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
%ad
chỉ 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!
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 log
vào awk
và 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, %ad
cho biết ngày của tác giả ở định dạng ISO và %aN
cho biết tên tác giả.
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 %H
vào để lấy gitsha
git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u