เอาต์พุตที่สั้นที่สุดที่เป็นไปได้จากบันทึก git ที่มีผู้แต่งและวันที่


465

ฉันจะแสดงผลบันทึก git ด้วย (อย่างน้อย) ข้อมูลนี้ได้อย่างไร:

* author
* commit date
* change

ฉันต้องการให้มันบีบอัดหนึ่งบรรทัดต่อรายการบันทึก รูปแบบที่สั้นที่สุดที่เป็นไปได้คืออะไร

(พยายาม--format=onelineแต่ไม่แสดงวันที่)


2
บางทีคุณอาจชอบเวอร์ชั่นสีของฉัน: stackoverflow.com/a/49534733/2292766
Hannes Schneidermayer

คำตอบ:


699

git log --pretty=format:"%h%x09%an%x09%ad%x09%s"

ทำงาน ผลลัพธ์นี้:

  fbc3503 mads    Thu Dec 4 07:43:27 2008 +0000   show mobile if phone is null...   
  ec36490 jesper  Wed Nov 26 05:41:37 2008 +0000  Cleanup after [942]: Using timezon
  ae62afd tobias  Tue Nov 25 21:42:55 2008 +0000  Fixed #67 by adding time zone supp
  164be7e mads    Tue Nov 25 19:56:43 2008 +0000  fixed tests, and a 'unending appoi
  93f1526 jesper  Tue Nov 25 09:45:56 2008 +0000  adding time.ZONE.now as time zone 
  2f0f8c1 tobias  Tue Nov 25 03:07:02 2008 +0000  Timezone configured in environment
  a33c1dc jesper  Tue Nov 25 01:26:18 2008 +0000  updated to most recent will_pagina

ได้รับแรงบันดาลใจจากคำถาม stackoverflow: "เอาต์พุตบันทึก git เช่น svn ls -v"ฉันพบว่าฉันสามารถเพิ่มพารามิเตอร์ที่แน่นอนที่ฉันต้องการได้

เพื่อย่อวันที่ (ไม่แสดงเวลา) ให้ใช้ --date=short

ในกรณีที่คุณอยากรู้ว่าตัวเลือกที่แตกต่างคืออะไร:
%h= ตัวย่อการกระทำแฮช
%x09= แท็บ (ตัวอักษรสำหรับรหัส 9)
%an= ชื่อ
%adผู้แต่ง = วันที่ผู้เขียน (รูปแบบการเคารพ - วันที่ = ตัวเลือก)
%s= หัวเรื่อง
จากkernel.org/pub/software/scm /git/docs/git-log.html (ส่วน PRETTY FORMATS ) โดยความคิดเห็นของ Vivek


6
... และมันยังมีประโยชน์ในการเพิ่มdate=shortเช่น cdunn2001 แนะนำในคำตอบอีก
Jesper Rønn-Jensen

10
oneliner ที่ชื่นชอบ (สั้น) ของฉันคือตอนนี้เพื่อสลับวันก่อนผู้เขียนและใช้วันที่สั้น:git log --pretty=format:"%h %ad%x09%an%x09%s" --date=short
Jesper Rønn-Jensen

143
เติมสีสันด้วยสีและแสดงการอ้างอิง:git log --pretty=format:'%C(yellow)%h %Cred%ad %Cblue%an%Cgreen%d %Creset%s' --date=short
kynan

16
ตารางคอลัมน์ความกว้างคงที่:alias glop="git log --pretty=format:'%C(yellow)%h|%Cred%ad|%Cblue%an|%Cgreen%d %Creset%s' --date=short | column -ts'|' | less -r"
Ciro Santilli 郝海东冠状病六四事件法轮功

15
ในกรณีที่คุณอยากรู้ว่าตัวเลือกที่แตกต่างคืออะไร:% h = ตัวย่อการแฮชแบบย่อ, แท็บ% x09 = (ตัวอักษรสำหรับรหัส 9),% an = ชื่อผู้แต่ง,% ad = วันที่ผู้เขียน (รูปแบบตัวเลือก % s = หัวเรื่อง จากkernel.org/pub/software/scm/git/docs/git-log.html (ส่วน PRETTY FORMATS )
Vivek

204

ฉันใช้การตั้งค่า. gitconfig ทั้งสองนี้:

[log]
  date = relative
[format]
  pretty = format:%h %Cblue%ad%Creset %ae %Cgreen%s%Creset

% ad คือวันที่ผู้แต่งซึ่งสามารถถูกแทนที่โดย--dateหรือตัวเลือกที่ระบุใน [บันทึก] stanza ใน. gitconfig ฉันชอบวันที่สัมพันธ์กันเพราะมันจะให้ความรู้สึกทันทีเมื่อมีสิ่งของเข้ามา ผลลัพธ์มีดังนี้:

6c3e1a2 2 hours ago you@me.com lsof is a dependency now.
0754f18 11 hours ago you@me.com Properly unmount, so detaching works.
336a3ac 13 hours ago you@me.com Show ami registration command if auto register fails
be2ad45 17 hours ago you@me.com Fixes #6. Sao Paolo region is included as well.
5aed68e 17 hours ago you@me.com Shorten while loops

แน่นอนว่าเป็นสีทั้งหมดดังนั้นจึงเป็นเรื่องง่ายที่จะแยกแยะส่วนต่าง ๆ ของบรรทัดบันทึก นอกจากนี้ยังเป็นค่าเริ่มต้นเมื่อพิมพ์git logเนื่องจากส่วน [รูปแบบ]

2014 UPDATE: เนื่องจาก git ตอนนี้รองรับการขยายฉันมีการแก้ไขที่ดีกับเวอร์ชั่นด้านบน:

pretty = format:%C(yellow)%h %Cblue%>(12)%ad %Cgreen%<(7)%aN%Cred%d %Creset%s

ด้านขวานี้จัดเรียงวันที่สัมพัทธ์และซ้ายจัดเรียงชื่อของคอมมิชชันซึ่งหมายความว่าคุณจะได้รูปลักษณ์เหมือนคอลัมน์ที่ง่ายต่อสายตา

ภาพหน้าจอ

  เอสเอส # 1

2016 การอัปเดต: เนื่องจาก GPG ยอมรับการลงนามกำลังกลายเป็นเรื่องฉันคิดว่าฉันจะอัปเดตโพสต์นี้ด้วยเวอร์ชันที่มีการตรวจสอบลายเซ็น (ในภาพหน้าจอมันเป็นตัวอักษรสีแดงอมม่วงหลังจากการส่ง) คำอธิบายสั้น ๆ ของธง:

% G?: แสดง "G" สำหรับลายเซ็นที่ดี (ถูกต้อง), "B" สำหรับลายเซ็นที่ไม่ดี, "U" สำหรับลายเซ็นที่ดีที่มีความถูกต้องที่ไม่รู้จักและ "N" โดยไม่มีลายเซ็นต์

การเปลี่ยนแปลงอื่น ๆ ได้แก่ :

  • ตอนนี้สีจะถูกลบออกถ้าเอาท์พุทเป็นอย่างอื่นนอกเหนือจาก tty (ซึ่งเป็นประโยชน์สำหรับ grepping ฯลฯ )
  • git log -g ตอนนี้มีตัวเลือก reflog
  • บันทึก 2 parens ใน refname และวางไว้ที่ท้าย (เพื่อรักษาการจัดแนวคอลัมน์)
  • ตัดวันที่สัมพันธ์กันถ้ามันยาวเกินไป (เช่น3 years, 4..)
  • ตัดทอนชื่อ commiter (อาจสั้นนิดหน่อยสำหรับ ppl บางอันเพียงแค่เปลี่ยน%<(7,trunc)หรือตรวจสอบคุณสมบัติgit .mailmapเพื่อย่อชื่อ commiter ให้สั้นลง)

นี่คือการกำหนดค่า:

pretty = format:%C(auto,yellow)%h%C(auto,magenta)% G? %C(auto,blue)%>(12,trunc)%ad %C(auto,green)%<(7,trunc)%aN%C(auto,reset)%s%C(auto,red)% gD% D

ทั้งหมดในการจัดแนวคอลัมน์ตอนนี้ได้รับการสงวนรักษาไว้เป็นอย่างดีกว่าด้วยค่าใช้จ่ายของตัวละครที่ไร้ประโยชน์ (หวังว่า) อย่าลังเลที่จะแก้ไขหากคุณมีการปรับปรุงใด ๆ ฉันชอบที่จะทำให้สีของข้อความขึ้นอยู่กับว่ามีการลงนามในการส่งมอบหรือไม่ แต่ดูเหมือนว่าจะเป็นไปไม่ได้

ภาพหน้าจอ

สกรีนช็อตของบันทึก git


3
คุณสามารถลดริ้วรอยได้มากยิ่งขึ้นโดยใช้mailmap ฉันได้ย่อชื่อเพื่อนร่วมงานในที่ทำงานของฉันลงไปที่ชื่อจริงเท่านั้น :-)
andsens

2
- คำตอบรูปแบบที่ดีนั้นดีและtigคำตอบนั้นให้การโต้ตอบโดยไม่มีการกำหนดค่าที่จำเป็น แต่อันนี้ยอดเยี่ยม - มันให้เอาต์พุตหนึ่งบรรทัดที่ร้องขอ (พร้อมสีในการบูต!) โดยใช้คำสั่ง 'git log' มาตรฐาน ดีมาก.
Brent Faust

เมื่อใช้ - ซ้าย - ขวาฉันจะไม่ได้รับ> <เครื่องหมายอีกต่อไป พยายามเพิ่ม%mรูปแบบ แต่แล้วก็ปรากฏขึ้นทุกครั้งแม้เป็นปกติ> git logเบาะแสใด ๆ ที่ทำเครื่องหมายว่าทำงานกับรูปแบบปกติได้อย่างไร
Vituel

1
@AlvaroCavalcanti แน่ใจว่าไม่มีปัญหา! gist.github.com/andsens/3ba598d829e948e1bf816e2c4cd5f282
andsens

2
@ TrầnViệtHoàng เป็นเพียงนามแฝงสำหรับ--oneline เป็นรูปแบบเริ่มต้นที่สวย แต่ไม่มีทางที่จะแทนที่afaik สิ่งที่ฉันต้องการจะทำอย่างไรงดเป็นสายในการตั้งค่าและจากนั้นทำการนามแฝงสำหรับการทำงาน --pretty=onelineformat.prettyformat.onelinepretty = shortloggit log --pretty=shortlog
andsens

99
git log --pretty=format:"%H %an %ad"

ใช้--date=เพื่อกำหนดรูปแบบวันที่

git log --pretty=format:"%H %an %ad" --date=short

1
ที่ดี! ครั้งต่อไปผมอาจจะใช้% h กว่า H% เป็นกัญชาเป็นเรื่องไร้สาระเพียงสำหรับตามนุษย์ของฉัน :)
Jesper Ronn เซ่น

ตามที่ขอ. ฉันเพียง แต่จะทำให้เป็นตัวอย่างง่ายๆ;)
knittl

2
เย็น! ฉันไม่รู้ --date = short
Jesper Rønn-Jensen

3
เพียงแค่โยนสิ่งนี้ออกไป (สาย 8 ปี): แฮชอาจดูเหมือนไร้สาระ แต่มันเป็นเครื่องมือที่มีประโยชน์ถ้าคุณต้องการที่จะทำเชอร์รี่หรือเปรียบเทียบความมุ่งมั่น บ่อยครั้งที่คุณระบุแฮชไม่ใช่เพราะมันมีความหมาย แต่เป็นเพราะมันมีประโยชน์
stevendesu

81

อย่าลังเลที่จะใช้อันนี้:

git log --pretty="%C(Yellow)%h  %C(reset)%ad (%C(Green)%cr%C(reset))%x09 %C(Cyan)%an: %C(reset)%s" -7

หมายเหตุ-7ที่ท้ายเพื่อแสดงเฉพาะ 7 รายการสุดท้าย

ดู:

ป้อนคำอธิบายรูปภาพที่นี่


3
--date=shortสามารถเพิ่มเพื่อให้สั้นลง
xuhdev

@ ฮันเนสชื่อสาขาอยู่ที่ไหน?
Pacerier

@Pacerier git logจะแสดงประวัติของสาขาที่เช็คเอาท์อยู่เสมอ
Hannes Schneidermayer

เพิ่ม%dเพื่อเรียกคืน "ชื่ออ้าง" (HEAD -> master)เช่น
2540625

ทำไมต้องใช้resetแทนauto?
2540625

49

tigเป็นทางเลือกที่เป็นไปได้ในการใช้คำสั่งgit logซึ่งมีอยู่ในการกระจายโอเพนซอร์สหลัก * nix

บนเดเบียนหรืออูบุนตูลองติดตั้งและใช้งานดังนี้:

$ sudo apt-get install tig

(tig รับการติดตั้ง)

$ tig

(บันทึกจะแสดงในเพจเจอร์ดังนี้โดยที่แฮชของคอมมิทปัจจุบันปรากฏที่ด้านล่าง

2010-03-17 01:07 ndesigner      changes to sponsors list
2010-03-17 00:19 rcoder         Raise 404 when an invalid year is specified.
2010-03-17 00:06 rcoder         Sponsors page now shows sponsors' level.
-------------------------- skip some lines ---------------------------------
[main] 531f35e925f53adeb2146dcfc9c6a6ef24e93619 - commit 1 of 32 (100%)

เนื่องจาก markdown ไม่รองรับการระบายสีข้อความให้จินตนาการ: คอลัมน์ 1: สีน้ำเงิน คอลัมน์ 2: สีเขียว; คอลัมน์ 3: สีข้อความเริ่มต้น บรรทัดสุดท้ายถูกไฮไลต์ กดปุ่มQหรือqเพื่อออก


tigจัดเรียงคอลัมน์โดยไม่มีขอบที่ขรุขระซึ่งแท็บ ascii (% x09) ไม่รับประกัน

สำหรับวันสั้นรูปแบบตีเมืองหลวงD (หมายเหตุ: ตัวพิมพ์เล็กdเปิดมุมมองที่แตกต่างได้.) กำหนดค่าอย่างถาวรโดยการเพิ่มshow-date = shortการ ~ / .tigrc; หรือใน[tig]ส่วนใน. git / configure หรือ ~ / .gitconfig

หากต้องการดูการเปลี่ยนแปลงทั้งหมด :

  • ตีใส่ บานหน้าต่างย่อยจะเปิดขึ้นในครึ่งล่างของหน้าต่าง
  • ใช้k , j keys เพื่อเลื่อนการเปลี่ยนแปลงในบานหน้าต่างย่อย
  • ในเวลาเดียวกันให้ใช้ปุ่มขึ้นและลงเพื่อเลื่อนจากกระทำไปยังกระทำ

เนื่องจาก tig นั้นแยกจาก git และเห็นได้ชัดว่าเฉพาะเจาะจง * มันอาจจะต้อง cygwin เพื่อติดตั้งบน windows แต่สำหรับฟางผมเชื่อว่าการติดตั้งคำสั่งที่มี$ su, ,(enter root password) # yum install tigสำหรับFreeBSDลอง% su, ,(enter root password)# pkg_add -r tig


โดยวิธีการที่ tig เป็นสิ่งที่ดีสำหรับมากกว่าการดูบันทึกอย่างรวดเร็ว: ภาพหน้าจอ & คู่มือ


โปรดให้ตัวอย่างเต็ม การเขียนtigในคอนโซลของฉันทำให้ฉันมีข้อผิดพลาด-bash: tig: command not found
Jesper Rønn-Jensen

10
ว้าว. เครื่องมือนี้ยอดเยี่ยมและรวดเร็วอย่างน่าประหลาดใจ! brew ติดตั้ง tig
bullfight

ถ้าคุณใช้ mac, ติดตั้ง tig
Pedro Brasileiro

1
บน Windows ผู้ใช้ babun สามารถpact install tig
obojdi

34
git log --pretty=format:'%h %ad %s (%an)' --date=short  

หรือ

git log --pretty=format:'%h %ad %s | %an' --date=short  

... riffing ในคำตอบของ cdunn2001 ด้านบน: ฉันจะเสีย e = mail ของผู้เขียนและรวมเพียงชื่อผู้แต่งตาม Jesper และ knittl แต่ตามแนวคิดของ cdunn2001 ในการรักษาเอาต์พุตในคอลัมน์ที่มีความกว้างคงที่เพื่อความสะดวกในการอ่าน ( ความคิดที่ดี!). แทนที่คอลัมน์ที่จัดชิดขอบด้านซ้ายแยกต่างหากสำหรับชื่อผู้แต่งอย่างไรก็ตามฉันตัดแฟล็กนั้นที่ท้ายคำสั่งด้วยวงเล็บหรือชดเชยด้วยไพพ์ (จริงๆอาจเป็นตัวละครที่ทำหน้าที่เป็นเครื่องช่วยด้านการมองเห็นในการอ่านเอาต์พุต ... แม้ว่าอาจจะเหมาะสมที่จะหลีกเลี่ยงการย้อนกลับหรือไปข้างหน้าทับเพื่อลดความสับสนในการส่งออกด้วยไดเรกทอรีหรือบางสิ่ง)

ตัวอย่างผลลัพธ์:

6fdd155 2015-08-10 Fixes casting error in doSave | John Doe
c4f4032 2015-08-10 Fix for IE save. Add help button. | Jane
29a24a6 2015-08-10 Fixes bug in Course | Mac

31

ใช้นามแฝง git ที่กำหนดไว้ล่วงหน้าเช่น:

$ git work

สร้างครั้งเดียวโดยคำสั่ง:

$ git config --global alias.work 'log --pretty=format:"%h%x09%an%x09%ad%x09%s"'

https://git-scm.com/book/tr/v2/Git-Basics-Git-Aliases

หรือสีที่มีกราฟมากขึ้น:

$ git config --global alias.work 'log --pretty=format:"%C(yellow)%h %ar %C(auto)%d %Creset %s , %Cblue%cn" --graph --all'

ป้อนคำอธิบายรูปภาพที่นี่


ใช่ฉันชอบอันนี้!
Alex

8
git log --pretty=format:'%h %ad  %s%x09%ae' --date=short

ผลลัพธ์:

e17bae5 2011-09-30  Integrate from development -> main      nixon@whitehouse.gov
eaead2c 2011-09-30  More stuff that is not worth mentioning bgates@apple.com
eb6a336 2011-09-22  Merge branch 'freebase' into development        jobs@nirvana.org

สิ่งที่มีความกว้างคงที่เป็นครั้งแรก ส่วนที่สำคัญที่สุด - โดเมนอีเมลนั้นมีความคงทนและกรองได้ง่าย


4

เพื่อแสดงความมุ่งมั่นที่ฉันได้จัดเตรียมไว้ซึ่งพร้อมที่จะผลักดันฉัน

git log remotes/trunk~4..HEAD --pretty=format:"%C(yellow)%h%C(white) %ad %aN%x09%d%x09%s" --date=short | awk -F'\t' '{gsub(/[, ]/,"",$2);gsub(/HEAD/, "\033[1;36mH\033[00m",$2);gsub(/master/, "\033[1;32mm\033[00m",$2);gsub(/trunk/, "\033[1;31mt\033[00m",$2);print $1 "\t" gensub(/([\(\)])/, "\033[0;33m\\1\033[00m","g",$2) $3}' | less -eiFRXS

ผลลัพธ์ดูเหมือนว่า:

ef87da7 2013-01-17 haslers      (Hm)Fix NPE in Frobble
8f6d80f 2013-01-17 haslers      Refactor Frobble
815813b 2013-01-17 haslers      (t)Add Wibble to Frobble
3616373 2013-01-17 haslers      Add Foo to Frobble
3b5ccf0 2013-01-17 haslers      Add Bar to Frobble
a1db9ef 2013-01-17 haslers      Add Frobble Widget

ตำแหน่งที่คอลัมน์แรกปรากฏเป็นสีเหลืองและ 'H' 'm' และ 't' ในพาเรนต์แสดง HEAD, master และ trunk และปรากฏในสี "- ตกแต่ง" ตามปกติ

ที่นี่มีการแบ่งบรรทัดเพื่อให้คุณสามารถเห็นสิ่งที่กำลังทำอยู่:

git log remotes/trunk~4..HEAD --date=short
    --pretty=format:"%C(yellow)%h%C(white) %ad %aN%x09%d%x09%s"
    | awk -F'\t' '{
         gsub(/[, ]/,"",$2);
         gsub(/HEAD/, "\033[1;36mH\033[00m",$2);
         gsub(/master/, "\033[1;32mm\033[00m",$2);
         gsub(/trunk/, "\033[1;31mt\033[00m",$2);
         print $1 "\t" gensub(/([\(\)])/, "\033[0;33m\\1\033[00m","g",$2) $3}'

ฉันใช้นามแฝงว่า "จัดฉาก" ด้วย:

git config alias.staged '!git log remotes/trunk~4..HEAD --date=short --pretty=format:"%C(yellow)%h%C(white) %ad %aN%x09%d%x09%s" | awk -F"\t" "{gsub(/[, ]/,\"\",\$2);gsub(/HEAD/, \"\033[1;36mH\033[00m\",\$2);gsub(/master/, \"\033[1;32mm\033[00m\",\$2);gsub(/trunk/, \"\033[1;31mt\033[00m\",\$2);print \$1 \"\t\" gensub(/([\(\)])/, \"\033[0;33m\\\\\1\033[00m\",\"g\",\$2) \$3}"'

(มีวิธีที่ง่ายกว่าในการหลบหนีหรือไม่?


เวอร์ชันปัจจุบันของสคริปต์นี้คือ ~ 300LOC และทำอะไรได้อีกมาก: ¶ - ตัวเลือกเพื่อสลับ oneline / multiline commit message ¶ - แสดงบรรทัดว่าง / บรรทัดสิ้นสุดในโหมดออนไลน์ เช่น¶ - ระบุช่วงผ่านparam¶ - จุดเด่นปัญหา # 's¶ - ไฮไลท์ / ^ - (แก้ไข | เพิ่ม | Refactor) / ในกระทำmessages¶
แซมเลอร์

สำหรับการอ้างอิงนามแฝงที่มีประสิทธิภาพแบบอัตโนมัติดูคำตอบนี้ สนใจที่จะแบ่งปัน ~ 300LOC ของคุณในส่วนสำคัญหรือไม่?
Tom Hale

ขอบคุณทอม! ถ้าฉันได้รับรอบในการโพสต์สคริปต์นั้น (ฉันต้องลบข้อมูลเฉพาะ / ข้อมูลเฉพาะของ บริษัท ) ฉันจะส่งข้อความถึงคุณที่นี่
Sam Hasler

1

คำแนะนำข้างต้นทั้งหมดใช้%sตัวยึดตำแหน่งสำหรับหัวเรื่อง ฉันจะแนะนำให้ใช้%Bเพราะ%sการจัดรูปแบบรักษาบรรทัดใหม่และข้อความคอมมิชชันหลายบรรทัดปรากฏขึ้น

git log --pretty=format:"%h%x09%an%x09%ai%x09%B"

0

เรียกใช้สิ่งนี้ในโฟลเดอร์โครงการ:

$ git log --pretty=format:"%C(yellow)%h %ar %C(auto)%d %Creset %s , %Cblue%cn" --graph --all

และหากคุณต้องการเพิ่มบรรทัดนี้ใน ~ / .gitconfig ของคุณ:

[alias]
    ...
    list = log --pretty=format:\"%C(yellow)%h %ar %C(auto)%d %Creset %s, %Cblue%cn\" --graph --all

0

ลองบันทึก git --pretty = fuller มันจะแสดงให้คุณเห็น: - ผู้แต่ง: วันที่เขียน: Commit: วันที่ตกลง:

หวังว่านี่จะช่วยได้

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