2010-09-02 2 views
28

Tôi có một bí danh đơn giản để hiển thị vài cam kết cuối cùng:Git ghi bảng định dạng

log --pretty=format:'%h %an %s' -10 

Làm thế nào tôi có thể làm cho các kết quả được hiển thị trong cột, như thế này:

898e8789 Author1    Commit message here 
803e8759 Other Author name Commit message here 
+0

Nếu có tiện ích Unix đóng hộp để làm điều này tôi rất muốn biết về điều đó! Điều tốt nhất tôi có thể nghĩ là đầu ra định dạng Perl, đó là một nỗi đau. – zwol

+3

@Zack: cột người đàn ông là bạn của bạn. – toong

+0

Điều đó dường như là một BSDism, thật không may. – zwol

Trả lời

37

Trong Git 1.8 .3 và sau đó, có hỗ trợ gốc cho điều này trong pretty format, sử dụng cú pháp %<(N) để định dạng trình giữ chỗ tiếp theo là N cột rộng:

$ git log --pretty=format:'%h %<(20)%an %s' -10 

Đối với các phiên bản trước 1.8.3, phiên bản trước của câu trả lời này, được giữ lại bên dưới, sẽ hoạt động. Đây là một giải pháp trong Bash sử dụng read để phân tích các dòng log lại, và printf để in chúng ra, với trường chiều rộng cố định cho tên tác giả sao cho các cột sẽ được xếp hàng. Nó giả định rằng | sẽ không bao giờ xuất hiện trong tên của tác giả; bạn có thể chọn một dấu tách khác nếu bạn nghĩ rằng đó có thể là một vấn đề.

git log --pretty=format:'%h|%an|%s' -10 | 
    while IFS='|' read hash author message 
    do 
    printf '%s %-20s %s\n' "$hash" "$author" "$message" 
    done 

Bạn có thể tạo này như một bí danh sử dụng:

[alias] 
    mylog = "!git log --pretty=format:'%h|%an|%s' -10 | while IFS='|' read hash author message; do printf '%s %-20s %s\n' \"$hash\" \"$author\" \"$message\"; done" 

tôi chắc chắn rằng bạn có thể làm điều này trong nhân vật ít sử dụng awk nhưng như the saying đi,

Bất cứ khi nào phải đối mặt với một vấn đề, một số người nói "Cho phép sử dụng AWK." Bây giờ, họ có hai vấn đề.

Tất nhiên, có nói rằng, tôi đã phải tìm ra cách để làm điều đó trong awk đó là một chút ngắn hơn:

git ... | awk -F '|' '{ printf "%s %-20s %s\n", $1, $2, $3 }' 
+0

Trong khi công trình này - sử dụng phương pháp git-log gốc như được đề xuất bởi @Jesse thì có nhiều neater –

+0

@SeanBurlington Khi tôi viết câu trả lời này vào năm 2010, điều đó không tồn tại; hỗ trợ cho phần giữ chỗ khoảng cách đã được thêm vào [trong 1.8.3, năm 2013] (https://github.com/git/git/commit/a57523428b4c08795e793356e12afc3de812f84a) (mặc dù vì một lý do nào đó, có vẻ như [thiếu từ ghi chú phát hành] (https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.3.txt)). Bây giờ bạn đã chỉ ra rằng có một giải pháp tốt hơn có sẵn, tôi đã kết hợp điều đó vào câu trả lời của tôi. –

+2

Tôi hy vọng rằng cú pháp '% <(N)' sẽ hoạt động trong các vùng khác của Git, nơi '--format' được sử dụng, nhưng nó dường như bị giới hạn trong' --pretty' hiện tại. Vào năm 2013 đã có [một số thảo luận] (http://lists-archives.com/git/797299-for-each-ref-support-aligned-for-left-alignment.html) về việc sử dụng cú pháp đó với 'cho mỗi -ref --format' và một số thử nghiệm với '% (...: aligned)' nhưng cuộc thảo luận đó dường như đã chết. – Dennis

14

Lệnh sau sẽ in các bản ghi trong một hình thức bảng

git log --pretty=format:'%h|%an|%s' -10 | column -t -s '|' 

lệnh column "cột" đầu ra, sử dụng dấu "|" như dấu phân cách trường, nó sẽ tìm ra chiều rộng cột tối ưu cho đầu vào, vì vậy nó sẽ hoạt động tốt ngay cả khi bạn có nhiều trường hơn.

Trên Linux, nó sẽ hoạt động ok miễn là bạn không sử dụng màu sắc, việc triển khai Linux không xử lý tốt ANSI escape codes.

Nhưng trong Mac OS X, nó sẽ xử lý màu và bạn có thể sử dụng bất kỳ ký tự unicode nào làm dấu phân tách trường. Tôi sử dụng ∑ vì tôi khá chắc chắn nó sẽ không xảy ra tình cờ trên văn bản cam kết. | là một lựa chọn không tồi bởi vì nó có thể xuất hiện trong mô tả cam kết và cũng nếu bạn sử dụng --graph --decorate --all nó sẽ xuất hiện như một phần của những biểu tượng sử dụng để vẽ đồ thị

+0

Câu trả lời đầu tiên tôi thấy rằng đã làm việc với điều này: 'git log --pretty = format: '% cr |% s' -10 | cột -t -s '|' ' – lightningleaf

31

Bạn cũng có thể làm:

git log --pretty=format:'%h %<(20)%an %s' -10 

Không cần cho ma thuật vỏ hoặc xử lý hậu kỳ với awk, column v.v.

+0

Điều này có vẻ như là giải pháp tốt nhất cho đến nay với tôi. Bạn đã tìm thấy tài liệu về cú pháp% <(20) ở đâu? –

+1

Nó được tham chiếu trong tài liệu 'git help log', trong phần PRETTY FORMATS (tôi đang sử dụng git version 1.8.3.4). – Conan

+0

Đây là câu trả lời ngắn nhất nhưng chính xác nhất. Không cần bất cứ điều gì khác, chỉ cần tích hợp git log. – hanhp

6

Để có được định dạng bảng thực sự, bạn cũng cần phải cắt ngắn tên người dùng dài hơn ví dụ: 20 ký tự:

git log --pretty=format:'%h %<(20,trunc)%an %s' -10 

Ngoài ra, nếu bạn đang outputting đến nhà ga, bạn có thể muốn ngăn chặn dòng tràn bởi một trong hai cắt bỏ lĩnh vực cam kết thông báo:

git log --pretty=format:'%h %<(20,trunc)%an %<(39,trunc)%s' -10 

hoặc gói những dòng và thụt bất kỳ các đường tràn để căn chỉnh:

git log --pretty=format:'%w(79, 0, 29)%h %<(20,trunc)%an %s' -10 
+0

@TamaMcGlinn Hy vọng điều này sẽ hữu ích – insysion