Màu trong git-log


106

Khi bạn chạy git log --decorate --pretty=onelineđầu ra sẽ có các mục như (HEAD, refs/published/master, master)với màu.

Tôi cũng có những thứ sau trong gitconfig của mình:

[color "branch"]
    current = yellow reverse
    local = yellow
    remote = green

Làm cách nào để bạn tái tạo những màu đó khi thực hiện một định dạng tùy chỉnh như sau?

git log --decorate --stat --graph --pretty=format:"%d %Cgreen%h%Creset (%ar - %Cred%an%Creset), %s%n"

Câu trả lời:


91

Kể từ git 1.8.3 (ngày 24 tháng 5 năm 2013), bạn có thể sử dụng %C(auto)để trang trí %dtrong chuỗi định dạng của git log.

Từ ghi chú phát hành :

 * "git log --format" specifier learned %C(auto) token that tells Git
   to use color when interpolating %d (decoration), %h (short commit
   object name), etc. for terminal output.)

60

Ý git log --decoratemuốn được đặt theo mặc định:

  • HEAD bằng màu lục lam
  • cành cây ở xa màu đỏ
  • thẻ màu xanh lá cây

và có thể được thay đổi thông qua color.decorate cấu hình.

Nhưng git log --formatkhông cung cấp cách hiển thị cụ thể HEAD hoặc điều khiển từ xa hoặc nhánh: cả ba đều được hiển thị thông qua%d , với một màu có thể.


Cập nhật tháng 5 năm 2013, như được đề cập bên dưới bởi Elad Shahar (được ủng hộ), git 1.8.3 cung cấp thêm một tùy chọn:

git log –formatbây giờ thể thao một %C(auto)mã thông báo cho Git sử dụng màu sắc khi phân giải %d(trang trí),%h (tên đối tượng cam kết ngắn), v.v. cho đầu ra của thiết bị đầu cuối.

Bài đăng trên blog Atlassian này nhận xét rằng tính năng này là một phần của một số tính năng khác tập trung vào định dạng ( git rebase, git count-objects) và màu sắc (git branch -vv )

Điều này bổ sung cho phiên auto,resetbản 1.8.2 trước đó , tự động tắt màu khi đầu ra không được sử dụng cho thiết bị đầu cuối1

%C(auto,blue)Hello%C(auto,reset)

Lưu ý: git 2.4+ (Quý 2 năm 2015) sẽ thực hiện tốt hơn việc đặt lại màu xung quanh tên nhánh.
Xem cam kết 5ee8758 của Junio ​​C Hamano ( gitster) :

log --decorate: không bị rò rỉ màu "cam kết" vào mục tiếp theo

Trong " git log --decorate", bạn sẽ thấy tiêu đề cam kết như thế này:

commit ... (HEAD, jc/decorate-leaky-separator-color)

trong đó " commit ... (" được vẽ vào color.diff.commit" HEAD" trong color.decorate.head", ," trong color.diff.commit, tên chi nhánh tại color.decorate.branchvà sau đó đóng ") " trong color.diff.commit.

Nếu bạn muốn sơn HEAD và tên chi nhánh cục bộ cùng màu với văn bản nội dung (có lẽ vì màu lục lam và xanh lá cây quá mờ trên thiết bị đầu cuối đen trắng để có thể đọc được), bạn sẽ không muốn phải nói

[color "decorate"]
    head = black
    branch = black

bởi vì bạn sẽ không thể sử dụng lại cùng một cấu hình trên thiết bị đầu cuối trắng-đen. Bạn sẽ ngây thơ mong đợi

[color "decorate"]
    head = normal
branch = normal

để làm việc, nhưng tiếc là nó không.
Nó vẽ chuỗi "HEAD " và tên chi nhánh cùng màu với dấu ngoặc đơn mở đầu hoặc dấu phẩy giữa các phần tử trang trí.
Điều này là do mã quên đặt lại màu sau khi in "tiền tố" bằng màu của chính nó.


Lưu ý rằng git 2.5 (Quý 2 năm 2015) sửa một lỗi:

Xem cam kết 429ad20 bởi Junio ​​C Hamano ( gitster) , ngày 13 tháng 5 năm 2015.
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết fd70780 , ngày 22 tháng 5 năm 2015)

log: không rút ngắn tên trang trí quá sớm

Các " log --decorate" tăng cường trong Git 2.4 rằng chương trình cam kết ở mũi của chi nhánh ví dụ như hiện tại " HEAD -> master", không làm việc với --decorate = đầy đủ.


Git 2.9.x + (Q3 2016) sẽ sửa một lỗi khác và vinh dự color=autocho%C(auto)


Git 2.10.2 (tháng 10 năm 2016) sửa các lỗi khác với cam kết 82b83da (29 tháng 9 năm 2016) và cam kết c99ad27 (17 tháng 9 năm 2016) bởi René Scharfe (``) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 76796d4 , ngày 28 tháng 10 năm 2016)

pretty: tránh thêm thiết lập lại %C(auto)nếu đầu ra trống

Chúng tôi tạo ra một chuỗi thoát để đặt lại màu và thuộc tính %C(auto)để đảm bảo màu tự động được hiển thị như dự định.
Dừng làm điều đó nếu strbuf đầu ra trống , tức là khi %C(auto)xuất hiện ở đầu chuỗi định dạng, vì khi đó không cần thiết lập lại và chúng tôi tiết kiệm một vài byte trong đầu ra.

pretty: hãy %C(auto)đặt lại tất cả các thuộc tính

Màu sắc thiết lập lại và các thuộc tính khi %C(auto)để cho phép toàn quyền kiểm soát tự động qua chúng; nếu không các thuộc tính như in đậm hoặc đảo ngược vẫn có thể có hiệu lực từ các %Ctrình giữ chỗ trước đó .


3
không có cách nào để sử dụng --dec decor và --pretty = "... công cụ"?
NorthIsUp

8
@NorthlsUp: --decoratedường như có cách triển khai và cấu hình riêng, trong khi --prettycung cấp cùng một thông tin thông qua %dmột khối, nghĩa là bạn không thể có cùng mức cấu hình màu chi tiết --prettyhơn so với mức bạn có --decorate.
VonC

Sự khác biệt duy nhất tôi thấy khi tôi thêm "--dec decor" sau "git log" là các repo bắt đầu bằng "refs / heads / ..." hoặc "refs / remotes ...". Màu sắc hiển thị theo cả hai cách. Bất kỳ ý tưởng nào sẽ gây ra điều này? Lý do tôi hỏi là .gitconfig của tôi không hiển thị bất kỳ thuộc tính màu nào. Tôi tự hỏi tôi có thể tìm thuộc tính "color.dec decor" của mình ở đâu. Tôi không thấy nó trong tệp .gitconfig của mình.
J Woodchuck

@JWoodchuck Hãy thử git config --show-origin -l: bạn sẽ thấy tất cả các cấu hình của mình. Sau đó, bạn có thể xám cho "màu".
VonC

Đúng, không có gì hiển thị khi tôi tìm màu sắc, điều này làm cho nơi cài đặt hiển thị rất bí ẩn.
J Woodchuck

9

Đặt dấu ngoặc đơn:

%C(...): color specification, as described in color.branch.* config option

Vì vậy, %C(yellow reverse)sẽ làm việc.


1
không hoàn toàn, %dlà tất cả các nhánh vì vậy nó có thể trông giống như (HEAD, master), trong trường hợp này, đầu phải có màu xanh lam và chủ phải có màu xanh lá cây (tôi tin rằng đó là những màu mặc định). nơi %C(yellow)%d%Cresetsẽ làm cho tất cả cùng một màu.
NorthIsUp

2
Ồ, tô màu các đồ trang trí riêng lẻ. Tôi nghĩ điều đó là không thể. Mã để hiển thị các mục nhật ký về cơ bản được thực hiện hai lần.
Josh Lee

1
Quá xấu này là không thể ... Tôi rất thích làmgit log --decorate --oneline --date=...
mgalgs

8

Tùy chọn cấu hình log.decoratecó thể bật / tắt các trang trí mặc định trong nhật ký.

git config --global log.decorate full

Sau khi hoàn thành, bạn có thể sử dụng color.decorate.*để chơi với các màu sắc


3
log.decorate=fullkhiến tên ref được in với tiền tố của chúng ( refs/heads/, v.v.); Tôi thấy log.decorate=shorthữu ích hơn.
musiphil

1
Thiết lập rất hữu ích, mặc dù tôi cũng thích shorthơnfull
Thomas Levesque

4

Một số có thể muốn sử dụng cái này: %C(colorname) Cái này không cần thay đổi cấu hình màu.

Ví dụ: Tô màu tên tác giả bằng màu vàng

--pretty=format:"%C(yellow)%an%Creset"

Màu ANSI thông thường sẽ hoạt động https://en.wikipedia.org/wiki/ANSI_escape_code

  • đen
  • đỏ
  • màu xanh lá
  • màu vàng
  • màu xanh da trời
  • đỏ tươi
  • lục lam
  • trắng
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.