สีใน git-log


106

เมื่อคุณเรียกใช้git log --decorate --pretty=onelineเอาต์พุตจะมีรายการเช่นเดียว(HEAD, refs/published/master, master)กับการระบายสี

ฉันมีสิ่งต่อไปนี้ใน gitconfig ของฉันด้วย:

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

คุณทำซ้ำสีเหล่านั้นได้อย่างไรเมื่อทำรูปแบบที่กำหนดเองดังต่อไปนี้

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

คำตอบ:


91

ตั้งแต่ git 1.8.3 (24 พฤษภาคม 2013) คุณสามารถใช้%C(auto)เพื่อตกแต่ง%dในสตริงรูปแบบของgit log.

จากบันทึกประจำรุ่น :

 * "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 --decorateจะใส่โดยค่าเริ่มต้น:

  • HEAD เป็นสีฟ้า
  • กิ่งก้านที่ห่างไกลเป็นสีแดง
  • แท็กเป็นสีเขียว

และสามารถเปลี่ยนแปลงได้ผ่าน color.decorateconfig

แต่git log --formatไม่ได้เสนอวิธีการแสดงเฉพาะHEAD หรือรีโมทหรือสาขา: ทั้งสามจะแสดงผ่านโดย%dมีสีเดียวที่เป็นไปได้


อัปเดตเมื่อเดือนพฤษภาคม 2013 ตามที่ระบุไว้ด้านล่างโดยElad Shahar (โหวตเพิ่ม) git 1.8.3 มีอีกหนึ่งทางเลือก:

git log –formatตอนนี้มี%C(auto)โทเค็นที่บอกให้ Git ใช้สีเมื่อแก้ไข%d(ตกแต่ง) %h(ชื่อวัตถุคอมมิตสั้น ๆ ) ฯลฯ สำหรับเอาต์พุตเทอร์มินัล

โพสต์บล็อก Atlassianนี้แสดงความคิดเห็นว่าคุณลักษณะนี้เป็นส่วนหนึ่งของคุณลักษณะอื่น ๆ ที่เน้นรูปแบบ ( git rebase, git count-objects) และสี ( git branch -vv)

สิ่งนี้มาเพิ่มเติมจากรุ่นก่อนหน้าauto,resetของ 1.8.2ซึ่งจะปิดใช้งานสีโดยอัตโนมัติเมื่อไม่ได้ใช้เอาต์พุตสำหรับเทอร์มินัล 1

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

หมายเหตุ: git 2.4+ (Q2 2015) จะทำการรีเซ็ตสีรอบ ๆ ชื่อสาขาได้ดีขึ้น
ดูการกระทำ 5ee8758โดยJunio ​​C Hamano ( gitster) :

log --decorate: อย่าให้สี "กระทำ" รั่วไหลในรายการถัดไป

ใน " git log --decorate" คุณจะเห็นส่วนหัวของการคอมมิตดังนี้:

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

ที่ไหน " commit ... (" ทาสีcolor.diff.commit" HEAD" ในcolor.decorate.head" ," ในcolor.diff.commitชื่อสาขาใน color.decorate.branchแล้วปิด " )" color.diff.commitใน

หากคุณต้องการวาด HEAD และชื่อสาขาในท้องถิ่นด้วยสีเดียวกับเนื้อหา (อาจเป็นเพราะสีฟ้าและสีเขียวจางเกินไปบนขั้วสีดำบนสีขาวที่จะอ่านได้) คุณคงไม่อยากพูด

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

เนื่องจากคุณจะไม่สามารถใช้การกำหนดค่าเดิมซ้ำบนเทอร์มินัลสีขาวบนสีดำได้ คุณจะคาดหวังอย่างไร้เดียงสา

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

ในการทำงาน แต่น่าเสียดายที่มันไม่ได้
มันวาดสตริง " HEAD" และชื่อสาขาด้วยสีเดียวกับวงเล็บเปิดหรือลูกน้ำระหว่างองค์ประกอบการตกแต่ง
เนื่องจากรหัสลืมรีเซ็ตสีหลังจากพิมพ์ "คำนำหน้า" ด้วยสีของตัวเอง


โปรดทราบว่า git 2.5 (Q2 2015) แก้ไขข้อบกพร่อง:

ดูการกระทำ 429ad20โดยJunio ​​C Hamano ( gitster) , 13 พฤษภาคม 2015
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ fd70780 , 22 พฤษภาคม 2015)

log: อย่าย่อชื่อการตกแต่งเร็วเกินไป

การlog --decorateเพิ่มประสิทธิภาพ "" ใน Git 2.4 ที่แสดงการกระทำที่ส่วนปลายของสาขาปัจจุบันเช่น " HEAD -> master" ใช้ไม่ได้กับ --decorate = full


Git 2.9.x + (Q3 2016) จะแก้ไขข้อบกพร่องอื่นและเป็นเกียรติcolor=autoสำหรับ%C(auto)


Git 2.10.2 (ตุลาคม 2016) การแก้ไขข้อบกพร่องอื่น ๆ ที่มีการกระทำ 82b83da (29 กันยายน 2016) และกระทำ c99ad27 (17 กันยายน 2016) โดยRené Scharfe ( ``)
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 76796d4 , 28 ตุลาคม 2016)

pretty: หลีกเลี่ยงการเพิ่มการรีเซ็ต%C(auto)หากเอาต์พุตว่างเปล่า

เราปล่อยลำดับการหลบหนีสำหรับการรีเซ็ตสีและแอตทริบิวต์%C(auto)เพื่อให้แน่ใจว่าการแสดงสีอัตโนมัติตามที่ต้องการ
หยุดทำเช่นนั้นหาก strbuf เอาต์พุตว่างกล่าวคือเมื่อ%C(auto)ปรากฏขึ้นที่จุดเริ่มต้นของสตริงรูปแบบเพราะไม่จำเป็นต้องรีเซ็ตและเราบันทึกสองสามไบต์ในเอาต์พุต

pretty: ให้%C(auto)รีเซ็ตแอตทริบิวต์ทั้งหมด

รีเซ็ตสีและคุณลักษณะเมื่อ%C(auto)เปิดใช้งานการควบคุมอัตโนมัติเต็มรูปแบบ มิฉะนั้นคุณลักษณะเช่นตัวหนาหรือย้อนกลับอาจจะยังคงมีผลตั้งแต่ก่อนหน้านี้%Cตัวยึด


3
ไม่มีวิธีใช้ - ตกแต่งและ - สวย = "... ของ"?
NorthIsUp

8
@NorthlsUp: --decorateดูเหมือนว่าจะมีการดำเนินการของตัวเองและการกำหนดค่าในขณะที่--prettyข้อเสนอข้อมูลเดียวกันผ่าน%dเป็นหนึ่งในบล็อกซึ่งหมายความว่าคุณไม่สามารถมีระดับเม็ดเล็กเดียวกันของการตั้งค่าสีที่มีมากกว่าที่คุณมีกับ--pretty --decorate
VonC

ความแตกต่างเดียวที่ฉันเห็นเมื่อเพิ่ม "--decorate" หลัง "git log" คือ repos ที่ขึ้นต้นด้วย "refs / head / ... " หรือ "refs / remotes ... " สีจะปรากฏขึ้นทางใดทางหนึ่ง มีความคิดอะไรที่จะทำให้เกิดสิ่งนี้? เหตุผลที่ฉันถามคือ. gitconfig ของฉันไม่แสดงคุณสมบัติสีใด ๆ ฉันสงสัยว่าจะหาอสังหาริมทรัพย์ "color.decorate" ของฉันได้ที่ไหน ฉันไม่เห็นมันในไฟล์. gitconfig ของฉัน
J Woodchuck

@JWoodchuck ลองgit config --show-origin -l: คุณจะเห็นการกำหนดค่าทั้งหมดของคุณ จากนั้นคุณสามารถ grep สำหรับ "color"
VonC

ใช่ไม่มีอะไรปรากฏขึ้นเมื่อฉัน grep สำหรับสีซึ่งทำให้การตั้งค่าปรากฏขึ้นลึกลับมาก
J Woodchuck

9

วงเล็บ:

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

ดังนั้น%C(yellow reverse)จะได้ผล


1
ไม่มาก%dเป็นทุกสาขาดังนั้นจึงอาจดูเหมือน(HEAD, master)ในกรณีนี้ส่วนหัวควรเป็นสีน้ำเงินและหลักควรเป็นสีเขียว (ฉันเชื่อว่าเป็นสีเริ่มต้น) ที่%C(yellow)%d%Cresetจะทำให้เป็นสีเดียวกันทั้งหมด
NorthIsUp

2
โอ้ระบายสีของตกแต่งแต่ละชิ้น ฉันคิดว่ามันเป็นไปไม่ได้ รหัสในการแสดงรายการบันทึกจะถูกนำไปใช้สองครั้งเป็นหลัก
Josh Lee

1
แย่จังที่เป็นไปไม่ได้ ... ฉันชอบที่จะทำgit log --decorate --oneline --date=...
mgalgs

8

ตัวเลือกการกำหนดค่าlog.decorateสามารถเปิด / ปิดการตกแต่งเริ่มต้นในบันทึก

git config --global log.decorate full

เมื่อเสร็จแล้วคุณสามารถใช้color.decorate.*เพื่อเล่นกับสี


3
log.decorate=fullทำให้ชื่ออ้างอิงถูกพิมพ์ด้วยคำนำหน้า ( refs/heads/ฯลฯ ); ฉันพบว่าlog.decorate=shortมีประโยชน์มากขึ้น
musiphil

1
การตั้งค่าที่มีประโยชน์มากแม้ว่าฉันจะชอบshortมากกว่าก็ตามfull
Thomas Levesque

4

บางคนอาจต้องการใช้สิ่งนี้: %C(colorname) ไม่จำเป็นต้องเปลี่ยนการกำหนดค่าสี

ตัวอย่าง: ระบายสีชื่อผู้แต่งด้วยสีเหลือง

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

สี ANSI ปกติควรใช้งานได้https://en.wikipedia.org/wiki/ANSI_escape_code

  • สีดำ
  • สีแดง
  • สีเขียว
  • สีเหลือง
  • สีน้ำเงิน
  • ม่วงแดง
  • สีฟ้า
  • สีขาว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.