2010-06-04 10 views
19

Làm thế nào để tạo ra changelog của cam kết được nhóm theo ngày, ở định dạng:git: ngày changelog theo ngày

[date today] 
- commit message1 
- commit message2 
- commit message3 
... 
[date day+3] 
- commit message1 
- commit message2 
- commit message3 
... 
(skip this day if no commits) 

[date day+1] 
- commit message1 
- commit message2 
- commit message3 
... 
[date since] 
- commit message1 
- commit message2 
- commit message3 

Bất kỳ git lệnh log, hoặc kịch bản bash thông minh?

+1

gì nếu commitdate là không đơn điệu, do skew đồng hồ/đồng hồ sai cho một trong những người đóng góp? –

Trả lời

22

Đây là bẩn, nhưng phiên bản làm việc của kịch bản tôi đã đưa ra:

#!/bin/bash 
# Generates changelog day by day 
NEXT=$(date +%F) 
echo "CHANGELOG" 
echo ---------------------- 
git log --no-merges --format="%cd" --date=short | sort -u -r | while read DATE ; do 
    echo 
    echo [$DATE] 
    GIT_PAGER=cat git log --no-merges --format=" * %s" --since=$DATE --until=$NEXT 
    NEXT=$DATE 
done 
+1

Chỉ cần sử dụng một đường ống vào vòng lặp: 'sản xuất và sắp xếp ngày | trong khi đọc DATE; làm…; done'.Ngẫu nhiên, bạn có thể muốn 'GIT_PAGER = cat git log…' cho lần thứ hai (để ngăn chặn * git log * sử dụng máy nhắn tin khi toàn bộ đầu ra của tập lệnh sẽ đến một đầu cuối). Ngoài ra, bạn có thể muốn nhất quán với '--no-merges', nếu không bạn có thể nhận được các tiêu đề' [date] 'mà không có bất kỳ cam kết nào nếu tất cả các cam kết trong một ngày được hợp nhất. –

+0

Cảm ơn bạn Chris. Tôi đã cập nhật mã. (Trước đây tôi đã cố thêm ống vào cuối vòng lặp) – takeshin

+0

Tôi khai thác nó. Cảm ơn. –

1

git log--since--until, không khó để bao bọc một số thứ xung quanh.

1

Điều đó đòi hỏi chắc chắn nhất là một số loại tập lệnh.
Một chút như thế này commandline-fu

for k in `git branch|perl -pe s/^..//`;do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k|head -n 1`\\t$k;done|sort -r 

(không chính xác gì bạn đang sau nhưng có thể cung cấp cho bạn một ý tưởng dù sao)

tôi biết về GitStats trong đó có còn dữ liệu theo ngày tổ chức (nhưng không phải là cam kết tin nhắn)


Lưu ý: git branch một phần của lệnh này không được trang bị cho kịch bản, như Jakub Narębski nhận xét.
git for-each-ref hoặc git show-ref là ứng cử viên tự nhiên cho các lệnh tập lệnh, là đường ống dẫn nước lệnh.

+0

Cảm ơn câu trả lời thông tin này. Một điều nữa mà tôi cần biết: Cách liệt kê tất cả các cam kết cho ngày cụ thể, duy nhất: 'git log --since =" 2010-06-02 "--until =" 2010-06-02 " . – takeshin

+0

@takeshin: bạn đã thử 'git log --since =" 2010-06-02 "--until =" 2010-06-03 "'? (từ một ngày - 02 - khác - 03 -) – VonC

+0

@VonC, vâng, nhưng trong vòng lặp đơn giản tôi chỉ biết ngày tháng, không phải ngày tiếp theo. – takeshin

8

tôi không thể có được câu trả lời chấp nhận để xử lý cam kết hôm nay là thiết lập của tôi không xử lý các biến TIẾP đúng trên lần lặp đầu tiên. thông số git log sẽ chấp nhận một thời gian quá, mà loại bỏ sự cần thiết cho một ngày TIẾP THEO:

#!/bin/bash 
# Generates changelog day by day 
echo "CHANGELOG" 
echo ---------------------- 
git log --no-merges --format="%cd" --date=short | sort -u -r | while read DATE ; do 
    echo 
    echo [$DATE] 
    GIT_PAGER=cat git log --no-merges --format=" * %s" --since="$DATE 00:00:00" --until="$DATE 24:00:00" 
done 
+0

Điều này thực sự tốt đẹp. Điều duy nhất là tiếng vang [$ DATE] không hoạt động vì nó cố gắng đánh giá một biểu thức hay bất cứ điều gì. Vì vậy, chỉ cần loại bỏ các dấu ngoặc và nó tốt – Yanis

0

Tôi đã viết một kịch bản trong python để tạo ra một git log tuần-by-tuần.

Bạn có thể dễ dàng thay đổi nó để ngày, tháng, vv bằng cách thay đổi timedelta

https://gist.github.com/NahimNasser/4772132