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/ --aftervà --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ó %advà %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-agevà --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ó 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
%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!
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ả.
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
git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u