กราฟสาขาคอมไพล์สวย


1385

ฉันเคยเห็นหนังสือและบทความบางอย่างมีกราฟที่ดูน่ารักของกิ่งก้านและคอมมิท ฉันจะสร้างภาพประวัติศาสตร์ git ที่พิมพ์ได้คุณภาพสูงได้อย่างไร


4
ฉันได้สร้างสคริปต์ python เพื่อสร้างกราฟ graphiz! ลองดูสิ. github.com/chode/git-graph
Stephan Bechter

4
หากคุณต้องการคุณภาพสูงและพิมพ์ได้เครื่องมือของฉัน ( bit-booster.com/graph.html ) จะแปลง "git log" เป็น SVG สำหรับข้อมูลเพิ่มเติมโปรดดูคำตอบของฉัน
G. Sylvie Davies

2
คุณกำลังมองหาเครื่องมือในการมองเห็นประวัติความเป็นมาของคุณ - หรือ - เครื่องมือสร้างแผนภูมิซึ่งมีวิธีการวาด "กิ่ง Git" ที่สวยงามหรือไม่?
Uri Abramson

1
ซ้ำซ้อนที่เป็นไปได้ของการแสดงโครงสร้างสาขาใน git
trblnc

5
ฉันจะลบแท็กกำกับ -acyclic-graphs เพราะมันไม่เกี่ยวข้องกับคำถามนี้
Maksim Dmitriev

คำตอบ:


1843

ปรับปรุง: คำตอบนี้ได้รับความสนใจมากกว่าที่สมควร มันถูกโพสต์ครั้งแรกเพราะฉันคิดว่ากราฟดูดีและพวกเขาสามารถวาดใน Illustrator สำหรับสิ่งพิมพ์ - และไม่มีทางออกที่ดีกว่า แต่ตอนนี้มีคำตอบสำหรับคำถามนี้ที่มีอยู่มากมายเช่นfracz 's, Jubobs ', หรือHarry Lee ! โปรดลงคะแนนเหล่านั้น !!

อัปเดต 2: ฉันโพสต์เวอร์ชันที่ปรับปรุงแล้วของคำตอบนี้ไปยังโทโพโลยีการแสดงผลสาขาในคำถามคอมไพล์เนื่องจากมันเหมาะสมกว่านั้น เวอร์ชันนั้นมี lg3ซึ่งจะแสดงทั้งข้อมูลผู้แต่งและผู้ติดต่อดังนั้นคุณควรตรวจสอบ ออกจากคำตอบนี้ด้วยเหตุผลทางประวัติศาสตร์ (& rep ฉันจะยอมรับ) เหตุผลแม้ว่าฉันอยากจะลบมันจริงๆ

2 ¢ของฉัน: ฉันมีนามแฝงสองตัวที่ปกติฉันโยนใน~/.gitconfigไฟล์ของฉัน:

[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"

git lg/ git lg1ดูเหมือนว่านี้:
คอมไพล์ lg1

และgit lg2มีลักษณะเช่นนี้:
คอมไพล์ lg2


35
ใช่ฉันทำ. ปกติและสดใส / สีหนามีสีดำ#202020/ #555555แดง: #5d1a14/ #da4939สีเขียว: #424e24/ #a5c261เหลือง: #6f5028/ #ffc66dสีฟ้า: #263e4e/ #6d9cbeม่วง: #3e1f50/ #a256c7ฟ้า: #234e3f/ #62c1a1และสีขาว: /#979797 #ffffff
Slipp D. Thompson

3
@ เทอร์โบ: สำหรับฉันสีสามารถเปลี่ยนแปลงได้ในการตั้งค่าโปรไฟล์สำหรับแอปเครื่องเทอร์มินัลของฉัน (Terminal.app) แอพเทอร์มินัลที่คุณใช้อาจสนับสนุนหรือไม่สนับสนุนการเปลี่ยนสีที่จะแสดงสำหรับสี ANSI ที่กำหนด นอกจากนี้ยังสร้างเส้นประ (เส้นประ em อย่างถูกต้อง) ด้วยปุ่มตัวเลือก shift- [ปุ่มยัติภังค์ - ลบ] ฉันคิดว่าฉันผิดอย่างผิด ๆ ว่าทุกแพลตฟอร์มในปัจจุบันมีกลิ่นอายของ Unicode
Slipp D. Thompson

3
ของคุณ--date=relativeและ--abbrev-commitซ้ำซ้อนเพราะคุณใช้อย่างชัดเจน%crและ%hตามลำดับ
graywh

6
ฉันจะเพิ่ม%C(auto)โมดิฟายเออร์ใน refname ( %d) เพื่อให้ได้สีที่ดีกว่า ดูstackoverflow.com/questions/5889878/color-in-git-log/ ......
Josef Eisl

2
คำตอบที่ดี ฉันได้แก้ไขคำสั่งให้ดูเหมือนผลลัพธ์ของlg = log --graph --abbrev-commit --decorate --format=format:'%C(yellow)%h%C(reset)%C(auto)%d%C(reset) %C(normal)%s%C(reset) %C(dim white)%an%C(reset) %C(dim blue)(%ar)%C (reset)' --all
Craig P. Motlin

1197

คำตอบมากมายที่นี่ยอดเยี่ยม แต่สำหรับผู้ที่ต้องการเพียงหนึ่งบรรทัดต่อคำตอบที่ง่ายโดยไม่ต้องตั้งค่านามแฝงหรืออะไรเพิ่มเติมนี่คือ:

git log --all --decorate --oneline --graph

ไม่ใช่ทุกคนที่จะทำgit logตลอดเวลา แต่เมื่อคุณต้องการเพียงจำ:

" A Dog " = บันทึกการคอมไพล์ - a - d - ecorate - o neline - g raph

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


252
git config --global alias.adog "log --all --decorate --oneline --graph"
fracz

4
ฉันกำลังมองหามาเป็น--allเวลานานฉันกำลังจะร้องไห้ (T_T) ขอบคุณ!
Felipe Gerard

2
- ออนไลน์ได้รับการแนะนำใน Git 1.6.3: github.com/git/git/blob/… --pretty = oneline จะทำงานกับ Git เวอร์ชันก่อน 1.6.3
Pat Myron

13
คำตอบที่ดีที่สุดสำหรับ SO ขอบคุณที่ทำให้มันเบิกบานใจ
Tobias Feil

4
ฉันคิดว่า "- ตกแต่ง" รวมอยู่ในค่าเริ่มต้นแล้ว แต่ฉันจะจำคำย่อด้วยวิธีนี้ต่อไป!
โยสิยาห์ Yoder

378

สำหรับเอาต์พุตแบบข้อความคุณสามารถลอง:

git log --graph --abbrev-commit --decorate --date=relative --all

หรือ:

git log --graph --oneline --decorate --all

หรือ: นี่คือ นามแฝงกราฟวิซสำหรับการวาดกราฟ DAG

ผมเองใช้gitx, และgitk --allgitnub


14
ฉันจะเพิ่ม--abbrev-commit --decorateแล้วมันสมบูรณ์แบบ!
ไม่สมมาตร

6
--abbrev-commit ถูกส่อให้เห็นโดย - ออนไลน์ใช่ไหม
dwineman

4
@dwineman ใช่คุณไม่จำเป็นต้องใช้--abbrev-commitถ้าคุณใช้--oneline
โทมัส

2
ดูเหมือนว่าในบรรทัดที่สองของคุณgit log --graph --oneline --decorate --date=relative --allการ--dateโต้แย้งไม่มีประโยชน์ ฉันไม่เห็นวันที่ที่แสดงในบันทึก
Lerner Zhang

วันที่จะไม่ปรากฏเมื่อ
บรรทัด

253

Gitgraph.jsอนุญาตให้วาดกิ่ง git ที่สวยโดยไม่มีที่เก็บ เพียงแค่เขียนรหัส Javascript ที่กำหนดค่าสาขาของคุณและกระทำและแสดงในเบราว์เซอร์

var gitGraph = new GitGraph({
   template: "blackarrow",
   mode: "compact",
   orientation: "horizontal",
   reverseArrow: true
});

var master = gitGraph.branch("master").commit().commit();
var develop = gitGraph.branch("develop").commit();
master.commit();
develop.commit().commit();
develop.merge(master);

กราฟตัวอย่างที่สร้างด้วย Gitgraph.js

หรือกับmetroแม่แบบ:

ธีมรถไฟฟ้าใต้ดิน GitGraph.js

หรือด้วยการส่งข้อความผู้เขียนและแท็ก:

GitGraph พร้อมส่งข้อความ

ทดสอบด้วยJSFiddle

สร้างด้วยGit Grapherโดย @bsara


3
เย้นั่นช่างน่าทึ่งจริงๆ! โพสต์ลงใน fiddle jsfiddle.net/guan1oz1เพื่อให้คุณสามารถทดสอบได้ทันที
berkus

14
ลูกศรควรชี้ไปที่ผู้ปกครองไม่ใช่เด็ก
jub0bs

4
@Jubobs: จุดดี นั่นเป็นอุปสรรค์ทั่วไปสำหรับผู้ที่พยายามเข้าใจ Git: พวกเขาคิดถึงลำดับเวลาแทนที่จะเป็นมรดก ทำให้เห็นได้ชัดว่าเกือบทุกอย่างในคอมไพล์นั้นสัมพันธ์กับบางสิ่งก่อนหน้านี้ช่วยให้ชิ้นส่วนอื่น ๆ
Slipp D. Thompson

6
เกี่ยวกับทิศทางลูกศรจากเอกสาร: * @param {Boolean} [options.reverseArrow = false] - ทำให้ลูกศรชี้ไปที่บรรพบุรุษถ้าเป็นจริง
Scott

2
FYI หลังจากเห็นโพสต์นี้และเล่นกับ gitgraph.js ฉันตัดสินใจที่จะสร้างเครื่องมือเล็ก ๆ ที่ทำให้ UI เป็น gitgraph.js ยังไม่เสร็จและ UI ยังไม่ได้อยู่ในตำแหน่งที่ฉันต้องการ แต่ยินดีต้อนรับการมีส่วนร่วม! ลองดู: github.com/bsara/git-grapher
bsara

123

สร้างขึ้นบนTikZ & PGF , gitdagsเป็นแพคเกจน้ำยางเล็ก ๆ น้อย ๆ ที่ช่วยให้คุณได้อย่างง่ายดายผลิตเวกเตอร์กราฟิกกระทำกราฟและอื่น ๆ อีกมากมาย

รุ่นอัตโนมัติของพื้นที่เก็บข้อมูลที่มีอยู่กระทำกราฟไม่ได้วัตถุประสงค์ของgitdags; กราฟที่สร้างขึ้นมีวัตถุประสงค์เพื่อการศึกษาเท่านั้น

ฉันมักจะใช้มันเพื่อสร้างกราฟสำหรับคำตอบของคำถาม Git ซึ่งเป็นทางเลือกสำหรับ ASCII ที่ทำกราฟ:

นี่คือตัวอย่างของกราฟที่แสดงให้เห็นถึงผลกระทบของการเรียบง่าย:

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

\documentclass{article}

\usepackage{subcaption}
\usepackage{gitdags}

\begin{document}

\begin{figure}
  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      % Commit DAG
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C,
          D -- E,
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}     % node name and text 
        {above=of E} % node placement
        {E}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{Before\ldots}
  \end{subfigure}

  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C -- D' -- E',
          {[nodes=unreachable] D -- E },
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}      % node name and text 
        {above=of E'} % node placement
        {E'}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{\ldots{} and after \texttt{git rebase origin/master}}
  \end{subfigure}
  \caption{Demonstrating a typical \texttt{rebase}}
\end{figure}

\end{document}

1
@ นั่นดูดี! ฉันต้องการวิธีการใช้งานสองสามบรรทัด: พิจารณาผู้ใช้ Windows ที่ไม่มีการติดตั้ง LaTeX เลย วิธีการสร้างกราฟจากรอยขีดข่วน?
VonC

1
@VonC ฉันไม่แน่ใจ แต่ถ้าคุณไม่ต้องการติดตั้ง LaTeX คุณอาจจะสามารถสร้างกราฟของคุณบนShareLatexและWriteLaTeXและไลค์ได้ ฉันจะดูมันและขยาย wiki เมื่อฉันมีเวลามากขึ้น ... รู้สึกอิสระที่จะส่งเสริมแพ็คเกจ:)
jub0bs

นี่คือสิ่งที่ยอดเยี่ยม! ฉันจะเขียนบทช่วยสอนในบางจุด แต่สำหรับตอนนี้ฉันแค่อยากจะพูดถึงว่าคุณสามารถโพสต์ประมวลผลกราฟของคุณโดยใช้ documentclass แบบสแตนด์อโลน (ฉันใช้ฟีเจอร์ครอบตัด) ใช้latex input.texเพื่อสร้าง dvi แล้วใช้dvisvgm input.dviเพื่อสร้าง SVG ด้วยความโปร่งใส แปลงจาก SVG ในรูปแบบแรสเตอร์เช่น PNG convert -antialias -density 300 -background none input.svg output.pngก็พอง่ายด้วย อย่างไรก็ตามภาพเหล่านี้ดูน่าทึ่งและโปร่งใส ยังคงทำงานเกี่ยวกับปัญหาแบบอักษร ... i.imgur.com/1Xu2Ry5.png
vmrob

5
ฉันใช้เวลาสักครู่ในการทำงานนี้ดังนั้นฉันจึงเขียนคำแนะนำทีละขั้นตอนวิธีการทำให้ gitdags ทำงานตั้งแต่เริ่มต้นบน Ubuntu 14.04
ChrisFreeman

1
@AndreaPolci ดูgithub.com/Jubobs/gitdags/issues/3สำหรับตัวอย่างของการผสาน เอกสารสำหรับgitdagsกำลังจะมา!
jub0bs

79

Gitgเป็นโคลนของ Gitk และ GitX สำหรับ GNOME (ใช้ได้กับ KDE ฯลฯ ) ซึ่งแสดงกราฟสีสวย

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

มันทำงานได้ดีกับที่เก็บข้อมูลขนาดใหญ่และกราฟการพึ่งพาที่ซับซ้อน

ภาพตัวอย่างหน้าจอแสดงที่เก็บ linux-git และ linux-2.6:

ลินุกซ์คอมไพล์

ลินุกซ์ 2.6


60

SourceTree เป็นสิ่งที่ดีจริงๆ มันจะพิมพ์ออกมาดูดีและประวัติขนาดกลางและกราฟสาขา: (ต่อไปนี้จะทำในโครงการ Git ทดลองเพียงเพื่อดูบางสาขา) รองรับ Windows 7+ และ Mac OS X 10.6+

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

http://www.sourcetreeapp.com/


นอกจากนี้ยังมีใน App Store ดังนั้นการอัปเดตควรทำงานโดยอัตโนมัติ
WebOrCode

ฉันชอบกราฟของ sourcetree แต่ฉันต้องการใช้บรรทัดคำสั่งและค่าเริ่มต้นของ sourcetree มักยุ่งกับ repos ของฉัน
SgtPooki

SourceTree จะยืนยันว่าคุณสร้างบัญชี Atlassian (หรือใช้บัญชี google ของคุณและให้สิทธิ์แก่ Atlassian เพื่อรับข้อมูลอีเมลและโปรไฟล์ของคุณ) และหลังจากติดตั้งบน Mac (OS X El Capitan v 10.11.5) ล้มเหลวในขั้นตอน 'Clonning': "ร้ายแรง: ไม่พบการแมป submodule ใน. gitmodules สำหรับเส้นทาง '<path skipped>'" และคำเตือนแปลก ๆ : "ไม่พบแม่แบบ / usr / local / git / share / git-core / template" ข้อความที่คลุมเครือมากไม่ค่อยดีนัก
Dmitry Shevkoplyas

3
และหลังจากถอนการติดตั้งอย่าลืมเก็บรักษาสิทธิ์ความปลอดภัยของ Google ที่คุณให้ไว้ก่อนหน้านี้: myaccount.google.com/security -> แอปและไซต์ที่เชื่อมต่อ -> แอปที่เชื่อมต่อกับบัญชีของคุณ -> จัดการแอป
Dmitry Shevkoplyas

60

ฉันเพิ่งเขียนเครื่องมือหนึ่งที่สามารถสร้างกราฟคอมมิทที่ใช้คอมไพล์ได้ด้วย HTML / Canvas

และจัดทำปลั๊กอิน jQuery ซึ่งทำให้ใช้งานง่าย

[github] https://github.com/tclh123/commits-graph

ตัวอย่าง:

ภาพตัวอย่าง


ดูดีคุณจะได้รับข้อมูลที่จัดรูปแบบล่วงหน้าเพื่อวาดกราฟนี้อย่างไร
Olga

3
@Olga ฉันเพิ่งเพิ่มรหัสแบ็กเอนด์ไปยัง repo ของฉัน คุณสามารถดูได้บน GitHub
Harry Lee

56

git-forestเป็นสคริปต์ Perl ที่ยอดเยี่ยมที่ฉันใช้มานานกว่าหนึ่งปีและฉันแทบจะไม่ใช้git logคำสั่งโดยตรงอีกเลย

นี่คือบางสิ่งที่ฉันชอบเกี่ยวกับสคริปต์นี้:

  • มันใช้อักขระ Unicode เพื่อวาดเส้นในกราฟให้ดูต่อเนื่องมากขึ้นกับเส้นกราฟ
  • คุณสามารถรวม--reverseกับเอาต์พุตกราฟซึ่งไม่สามารถทำได้ด้วยgit logคำสั่งปกติ
  • มันใช้git logภายในเพื่อคว้ารายการการกระทำดังนั้นตัวเลือกทั้งหมดที่คุณส่งไปgit logยังสามารถส่งผ่านไปยังสคริปต์นี้เช่นกัน

ฉันมีนามแฝงที่ใช้git-forestดังนี้:

[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"

นี่คือลักษณะที่เอาต์พุตดูเหมือนกับเทอร์มินัล:

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


3
@ void.pointer - ใช่ไม่ใช่เพราะ git-forest เป็นสคริปต์ Perl และมีการพึ่งพาโมดูล perl การเรียกใช้คอมไพล์ภายใต้ cygwin พร้อมกับการติดตั้งโมดูล perl ที่จำเป็นอาจเป็นทางเลือกที่ดีที่สุดที่คุณจะได้รับหากคุณต้องการสิ่งนี้บน Windows :)
Tuxdude

1
ว้าว repo นั้นมีเครื่องมือที่ยอดเยี่ยมมากมาย ขอบคุณ!
Eldelshell

1
ทำงานได้อย่างสมบูรณ์แบบ @MinGW (MSYS) ภายใต้ Win $; ติดตั้ง CPANM จากนั้น Git.pm; สร้างนามแฝงและคุณพร้อมที่จะไป
Sektor

เทอร์มินัลอีมูเลเตอร์ที่ดีมากที่คุณใช้คืออะไร ฉันชอบสิ่งที่ตัวบ่งชี้ที่พร้อมท์แบบกราฟิก
นิวแฮมป์เชียร์

วิธีการติดตั้ง "สคริปต์" นี้? ฉันใช้อูบุนตู
user13107

50

ฉันเขียนเครื่องมือเว็บสำหรับการแปลงบันทึก git เป็นกราฟ SVG ที่สวย: Bit-Booster - เครื่องมือวาดกราฟคอมมิท Commit

อัปโหลดผลลัพธ์จากgit log --pretty='%h|%p|%d'โดยตรงไปยังเครื่องมือจากนั้นคลิกที่ลิงก์ "ดาวน์โหลด graph.svg"

เครื่องมือนี้เป็นฝั่งไคลเอนต์ดังนั้นจึงไม่มีข้อมูล Git ของคุณแบ่งปันกับเซิร์ฟเวอร์ของฉัน นอกจากนี้คุณยังสามารถบันทึก HTML + JS ภายในเครื่องและเรียกใช้โดยใช้ "file: ///" URL ของ ตรวจสอบแล้วใน Chrome 48 และ Firefox 43 บน Ubuntu 12.04

มันสร้าง HTML ที่สามารถโพสต์ได้โดยตรงในหน้าใด ๆ (รวมถึงเครื่องมือบล็อก blogspot!) ดูที่โพสต์บล็อกบางส่วนได้ที่นี่:

http://bit-booster.blogspot.ca/

นี่คือภาพหน้าจอของไฟล์ HTML ตัวอย่างที่สร้างโดยเครื่องมือ:

http://bit-booster.com/graph.html (เครื่องมือ)


1
@Jay มันปรากฏสีที่สะท้อนถึงระดับการเยื้องของสาขานั้นและสาขาที่อาจย้ายไปยังคอลัมน์อื่นและดังนั้นจึงเปลี่ยนสีได้
Thorbjørn Ravn Andersen

44

จากสคริปต์ Graphviz ที่ฉันพบในคำตอบของคำถามที่เกี่ยวข้องฉันได้แฮกสคริปต์ rubyที่สร้างมุมมองสรุปของที่เก็บ git มันจะลบประวัติเชิงเส้นทั้งหมดและแสดงการกระทำที่ "น่าสนใจ" เช่นที่มีผู้ปกครองหลายคนเด็กหลายคนหรือชี้ไปที่สาขาหรือแท็ก นี่คือตัวอย่างของกราฟที่สร้างขึ้นสำหรับjquery :

ตัวอย่าง jquery

git-big-pictureและBranchMasterเป็นเครื่องมือที่คล้ายกันซึ่งพยายามแสดงเฉพาะโครงสร้างระดับสูงของกราฟโดยแสดงเฉพาะแท็กกิ่งไม้การผสานและอื่น ๆ ที่เกี่ยวข้อง

คำถามนี้มีตัวเลือกเพิ่มเติม


2
ฉันลองสิ่งนี้ แต่ไม่สามารถทำงานดอทได้อย่างถูกต้องกับเอาท์พุทสำหรับ repo ของเรา (42 สาขา, 175 แท็ก, 42.000 สัญญา) ... แย่มาก ... นั่นคือสิ่งที่ฉันกำลังมองหา!
ซาเวียร์โนเดต

1
@XavierNodet หาก repo ของคุณเป็นสาธารณะและ / หรือคุณมีข้อผิดพลาดอื่น ๆ โปรดยื่นปัญหาใน GitHub ขอบคุณ!
Matt McHenry

38

ฉันได้เพิ่มคำสั่งที่กำหนดเองที่สาม: git tree, และgit stree git vtreeฉันจะไปตามลำดับนั้น

[alias]
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(black)[%cr]%C(reset)  %x09%C(black)%an: %s %C(reset)'

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

ด้วยgit streeและgit vtreeฉันใช้ bash เพื่อช่วยในการจัดรูปแบบ

[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    stree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\";          \
        done < <(git logx && echo);"'

git_stree


[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    vtree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\";  \
        done < <(git logx && echo);"'

git_vtree


แก้ไข: ใช้งานได้กับ git รุ่น 1.9a เห็นได้ชัดว่าค่าสี 'อัตโนมัติ' เปิดตัวในรุ่นนี้ เป็นการเพิ่มที่ดีเพราะชื่อสาขาจะได้สีที่ต่างกัน สิ่งนี้ทำให้ง่ายต่อการแยกความแตกต่างระหว่างสาขาในพื้นที่และระยะไกล


fatal: bad color value 'auto' for variable '--pretty format':(
หมุน

กลายเป็น git รุ่นเก่า Yum มี Git รุ่นที่ล้าสมัยไปแล้วใน repo รวบรวมจากแหล่งที่มา (1.9) และใช้งานได้ดี มันก็สวยเช่นกัน! ขอบคุณ @ พระประวัติ
หมุน

ไม่ดำเนินการใน OS X:sed: illegal option -- r
Slipp D. Thompson

@ SlippD.Thompson: ฉันใช้ linux :) -r สำหรับนิพจน์ทั่วไปที่ขยายเพิ่ม เห็นได้ชัดว่ารุ่น OS ของ sed ไม่ได้มี บางทีคุณอาจปรับปรุง sed มิฉะนั้นคุณสามารถเขียนคำสั่ง sed ซ้ำโดยไม่ต้องใช้ regex เพิ่มเติม
พระประวัติ

1
สำหรับระบบปฏิบัติการ Mac OS X ใช้ -E แทน -r
Baxter Lopez

37

ขึ้นอยู่กับสิ่งที่พวกเขาดูเหมือน ฉันใช้gitxซึ่งทำให้ภาพเป็นเช่นนี้:

พล็อตที่เรียบง่าย

คุณสามารถเปรียบเทียบgit log --graphกับ gitk กับ octopus merge แบบ 24 ทาง (มีพื้นเพมาจากhttp://clojure-log.n01se.net/date/2008-12-24.html ):

การรวมปลาหมึกยักษ์ 24 ทาง  URL ดั้งเดิมคือ <code> http://lwn.net/images/ns/kernel/gitk-octopus.png </code>


49
มันตลก ... ฉันต้องสาบานแล้วฉันได้ยินคุณพูดว่า "ปลาหมึกยักษ์ 24 ทาง"!
dty

4
มีใครบ้างที่พยายามแยกรูทีนการวาดภาพของ GitX (หรือเครื่องมืออื่น ๆ ของ GUI git) ลงในปฏิบัติการแบบสแตนด์อโลน ถ้าฉันไม่เข้าใจผิดให้โคโค่วาดลงในไฟล์เวกเตอร์ PDF จะไม่ยากและจะสนองความต้องการของ OP สำหรับภาพที่พิมพ์ได้ Q สูง
Slipp D. Thompson

มันอยู่บน S3 ผ่านทาง Skitch ก่อนที่พวกเขาจะเปลี่ยนสิ่งของ ฉันหวังว่าฉันจะยังคงมีมัน :(
ดัสติน

เพียงแค่แทนที่ด้วยรุ่น gitk จากlwn.net/images/ns/kernel/gitk-octopus.pngเชื่อมโยงจากclojure-log.n01se.net/date/2008-12-24.html @Dustin: หวังว่าไม่เป็นไร มันไม่ใช่ภาพเดียวกัน แต่มันมีจุดประสงค์ที่คล้ายกัน จากการยิงหน้าจอดูเหมือนว่าเป็นส่วนหนึ่งของลินุกซ์เคอร์เนลดังนั้นฉันคิดว่าคุณสามารถพบว่ากระทำและอีกครั้งใช้เวลาหน้าจอ gitx เทียบเท่า ....
naught101

34

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับผลลัพธ์ของข้อความโปรดลอง:

git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short

คุณสามารถเขียนนามแฝงใน $ HOME / .gitconfig

[alias]
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short

29

นี่คือสิ่งที่ฉันใช้ในเรื่องนี้:

ภาพหน้าจอ:

ภาพหน้าจอ

การใช้งาน:

git hist - แสดงประวัติของสาขาปัจจุบัน

git hist --all - แสดงกราฟของทุกสาขา (รวมถึงรีโมท)

git hist master devel - แสดงความสัมพันธ์ระหว่างสองสาขาขึ้นไป

git hist --branches - แสดงสาขาท้องถิ่นทั้งหมด

เพิ่ม--topo-orderในการจัดเรียงกระทำ topologically แทนตามวันที่ (ค่าเริ่มต้นในนามแฝงนี้)

ประโยชน์ที่ได้รับ:

  • ดูเหมือนว่าธรรมดา--decorateดังนั้นมีสีแยกกันสำหรับชื่อสาขาที่แตกต่างกัน
  • เพิ่มอีเมลผู้ส่ง
  • เพิ่มการกระทำวันที่สัมพันธ์และวันที่แน่นอน
  • เรียงลำดับตามวันที่

ติดตั้ง:

git config --global alias.hist "log --graph --date-order --date=short \
--pretty=format:'%C(auto)%h%d %C(reset)%s %C(bold blue)%ce %C(reset)%C(green)%cr (%cd)'"

28

gitg : โปรแกรมดูพื้นที่เก็บข้อมูลที่ใช้ gtk ซึ่งเป็นของใหม่ แต่น่าสนใจและมีประโยชน์
http://git.gnome.org/browse/gitg
ฉันใช้มันในปัจจุบัน


2
ดูเหมือนว่าจะเป็นโคลนGitXและเป็นสิ่งที่ดีทีเดียว แนะนำ
Yarek T

28

แม้ว่าบางครั้งฉันใช้gitgกลับมาที่ command line เสมอ:

[alias]
    #quick look at all repo
    loggsa = log --color --date-order --graph --oneline --decorate --simplify-by-decoration --all
    #quick look at active branch (or refs pointed)
    loggs  = log --color --date-order --graph --oneline --decorate --simplify-by-decoration
    #extend look at all repo
    logga  = log --color --date-order --graph --oneline --decorate --all
    #extend look at active branch
    logg   = log --color --date-order --graph --oneline --decorate
    #Look with date
    logda  = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\" --all
    logd   = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\"        
    #Look with relative date
    logdra = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\" --all
    logdr = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\"  

    loga   = log --graph --color --decorate --all

    # For repos without subject body commits (vim repo, git-svn clones)
    logt  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\"
    logta  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all        
    logtsa = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all --simplify-by-decoration 

อย่างที่คุณเห็นเป็นชื่อแทนการบันทึกการกดแป้นพิมพ์เกือบตาม:

  • - สี: ดูชัดเจน
  • - กราฟ: เห็นภาพผู้ปกครอง
  • - วันที่สั่งซื้อ: ดูเข้าใจได้มากที่สุดที่ repo
  • - ตกแต่ง: ใครคือใคร
  • - ออนไลน์: หลายครั้งที่คุณต้องรู้เกี่ยวกับการกระทำ
  • - เรียบง่ายโดยการตกแต่ง: พื้นฐานสำหรับการดูครั้งแรก (เพียงแค่แท็กการรวมที่เกี่ยวข้องสาขา)
  • - ทั้งหมด: บันทึกการกดแป้นด้วยนามแฝงทั้งหมดที่มีและไม่มีตัวเลือกนี้
  • - วันที่ = สัมพัทธ์ (% ar): ทำความเข้าใจกับกิจกรรมใน repo (บางครั้งสาขาที่มีความมุ่งมั่นใกล้เจ้านาย แต่ไม่กี่เดือนที่ผ่านมาจากเขา)

ดูในรุ่นล่าสุดของ git (1.8.5 ขึ้นไป) คุณจะได้รับประโยชน์จาก% C (อัตโนมัติ) ในการตกแต่งตัวยึดตำแหน่ง% d

จากที่นี่สิ่งที่คุณต้องการคือความเข้าใจที่ดีของgitrevisionsในการกรองสิ่งที่คุณต้องการ (สิ่งที่ต้องการ master..develop ที่ - เรียบง่าย - การผสานจะช่วยให้สาขาในระยะยาว)

พลังงานที่อยู่เบื้องหลังบรรทัดคำสั่งคือการกำหนดค่าอย่างรวดเร็วตามความต้องการของคุณ (เข้าใจ repo ไม่ใช่การกำหนดค่าคีย์ล็อกที่ไม่ซ้ำกันดังนั้นการเพิ่ม --numstat หรือ --raw หรือ - ชื่อ - สถานะเป็นสิ่งจำเป็นบางครั้งนี่ git log และนามแฝงนั้นรวดเร็วมีประสิทธิภาพและ (ตามเวลา) กราฟที่สวยที่สุดที่คุณสามารถทำได้ยิ่งไปกว่านั้นด้วยเอาต์พุตที่แสดงโดยค่าเริ่มต้นผ่านเพจเจอร์ (พูดน้อยกว่า) คุณสามารถค้นหาในผลลัพธ์ได้อย่างรวดเร็วไม่เชื่อคุณสามารถแยกผลลัพธ์ได้เสมอ กับโครงการเช่นgitgraph


ดีมาก. การเพิ่มสิ่งเหล่านี้ในการกำหนดค่าของฉัน แต่ฉันขอแนะนำให้เปลี่ยน% เครดิต% d% Creset เป็น% C (อัตโนมัติ)% d% Creset ซึ่งจะให้สีที่แตกต่างกันสำหรับชื่อสาขาระยะไกลหรือท้องถิ่น
MarkB42

17

คำตอบที่ยอดเยี่ยมเล็กน้อยของ Slippคุณสามารถใช้นามแฝงของเขาเพื่อบันทึกเพียงหนึ่งสาขา:

[alias]
lgBranch1 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
lgBranch2 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(bold white)— %an%C(reset)' --abbrev-commit
lg = !"git lg1"

โดยออกจาก--allคุณสามารถทำได้

git lgBranch1 <branch name>

หรือแม้กระทั่ง

git lgBranch1 --all

15

ฉันแนะนำtig https://github.com/jonas/tig เครื่องมือบรรทัดคำสั่งที่ดีกว่ามากสำหรับ git

คุณสามารถใช้ homebrew เพื่อติดตั้ง tig บน macOS:

$ brew install tig
$ tig

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


14

ฉันมีgit logนามแฝงนี้~/.gitconfigเพื่อดูประวัติกราฟ:

[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'

ด้วยสิ่งนี้ในสถานที่git lจะส่งออกสิ่งที่ชอบ:

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

ใน Git 2.12 + คุณสามารถปรับแต่งสีเส้นของกราฟโดยใช้log.graphColorsตัวเลือกการกำหนดค่า

สำหรับรูปแบบล็อกก็คล้ายกับ--onelineมีการเพิ่มของชื่อผู้เขียน (เคารพ.mailmap) และวันที่ผู้เขียนญาติ โปรดทราบว่า%C(auto)ไวยากรณ์ซึ่งบอก Git ที่จะใช้สีเริ่มต้นสำหรับการกระทำกัญชา ฯลฯ ได้รับการสนับสนุนใน Git> = 1.8.3


1
git log --graph --oneline เพียงเพื่อให้แน่ใจว่า oneliner จะไม่หลงทาง
tsenapathy

มีวิธีการใส่ชื่อสาขาใน leftside หรือไม่?
anaval

12

คุณลองgitkหรือgitk --all? อย่างไรก็ตามมันไม่มีฟังก์ชั่นการพิมพ์ / บันทึก img


3
gitk นั้นมีประสิทธิภาพ แต่ไม่สวยงามมาก
Johan

ความจริงที่ว่ามันมาพร้อมกับตัวเครื่องทำให้ฉันสบายและไม่ยุ่งยาก โดยเฉพาะอย่างยิ่ง--allแสดงให้คุณเห็นทุกสาขา
BcK

12

GitGraph

สร้าง PNG หรือ SVG เพื่อแสดงประวัติการกระทำของที่เก็บ Git ของคุณ

https://code.google.com/p/gitgraph


@AndyHayden: ไม่ใช่ แตกต่างกันอย่างสิ้นเชิง. สร้างกราฟประวัติคอมไพล์โดยใช้Dia
rzymek

11
git -c core.pager='less -SRF' log --oneline --graph --decorate

นี่คือรูปแบบเทอร์มินัลของฉันคล้ายกับคำตอบมากมายที่นี่ ฉันต้องการปรับค่าสถานะที่ส่งผ่านlessเพื่อป้องกันการตัดคำ

เอาท์พุทตัวอย่าง

ฉันตั้งค่านี้เป็นนามแฝงสำหรับการเข้าถึงที่รวดเร็วเนื่องจากคำสั่งค่อนข้างยุ่งยาก


8

ลองditaa มันสามารถแปลงแผนภาพ ASCII ใด ๆ ให้เป็นภาพ แม้ว่าจะไม่ได้ออกแบบโดยคำนึงถึงสาขาของ Git แต่ฉันก็ประทับใจกับผลลัพธ์

ที่มา (ไฟล์ txt):

        +--------+
        | hotfix |
        +---+----+
            |
--*<---*<---*
       ^ 
       |
       \--*<---*
               |
           +---+----+
           | master |
           +--------+

คำสั่ง:

java -jar ditaa0_9.jar ascii-graph.txt

ผลลัพธ์:

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

นอกจากนี้ยังสนับสนุนสีพื้นหลังเส้นประรูปร่างที่แตกต่างและอื่น ๆ ดูตัวอย่าง


1
ในหลอดเลือดดำที่คล้ายกันcasual-effects.com/markdeepนั้นทรงพลังมากที่จะทำให้แผนภาพศิลปะ ASCII ที่จัดเรียงด้วยมือเรียบร้อยขึ้น
Beni Cherniavsky-Paskin

7

หากพื้นที่เก็บข้อมูลของคุณตั้งอยู่บน Gitlab คุณสามารถใช้การแสดงกราฟของมันตามที่แสดงเป็น SVG ในเบราว์เซอร์ของคุณ

  • ไปที่มุมมองกราฟของที่เก็บของคุณเช่นhttps://gitlab.com/gitlab-org/gitter/webapp/network/develop

  • เลื่อนกราฟลงไปที่ด้านล่าง (โหลดแบบขี้เกียจคอมมิท!)

  • ใช้เครื่องมือตรวจสอบของเบราว์เซอร์ของคุณเพื่อคัดลอกองค์ประกอบ SVG ไปยังไฟล์ใหม่

  • เปิดในโหมดแสดงภาพที่คุณเลือกเช่น Inkscape

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


6

ฉันไม่รู้เกี่ยวกับเครื่องมือโดยตรง แต่บางทีคุณสามารถแฮ็คสคริปต์เพื่อส่งออกข้อมูลในรูปแบบจุดและแสดงด้วยกราฟวิส


ลองใช้github.com/gugod/bin/blob/master/git-graphviz อันนี้ ฉันไม่ได้มีการพึ่งพาทั้งหมดในสภาพแวดล้อมขององค์กรของฉันดังนั้นการเปลี่ยนioคำสั่งเหล่านั้นให้เป็นคำสั่ง perl `git log [... ]` ที่ใช้งานได้ง่ายสำหรับฉัน
Ross Rogers

หากคุณบน Mac และคุณต้องการที่จะลองสคริปต์นี้คุณสามารถคว้า Perl ด้วยbrew install perl dotและจากนั้นcpan common::sense IO::allจะได้รับการอ้างอิง git-graphviz | dot -Tpng -o repo.pngจากนั้นเพียงแค่ท่อส่งออกไปยังคำสั่งที่เหมาะสมเช่น อย่างไรก็ตามผลลัพธ์ไม่ได้แตกต่างจากgit-big-pictureมาก
jrhorn424

6

มี Git ขี้ขลาดกระทำกราฟเป็นหนึ่งในการสาธิตของกราฟิลส์ห้องสมุดกราฟิกเว็บ

การสาธิตนั้นเป็นแบบสแตติก แต่ควรง่ายพอที่จะใช้รหัสและสลับข้อมูลสแตติกของพวกเขาเป็นชุดข้อมูลสด - ฉันคิดว่ามันเป็นเพียง Git ที่ส่งข้อมูลในรูปแบบ JSON

ตัวอย่างอยู่ที่นี่: http://dmitrybaranovskiy.github.io/raphael/github/impact.html


1
นั่นคือรหัสกราฟเดียวกับที่ใช้กับกราฟผลกระทบของ GitHub ใช่ไหม (เช่นgithub.com/DmitryBaranovskiy/raphael/graphs/impact )
Slipp D. Thompson

@Sven: ขอบคุณที่ชี้ให้เห็น ฉันได้แก้ไขลิงก์ที่ใช้งานไม่ได้ให้กับคุณแล้วโปรดจำไว้ว่าคำตอบนี้มีอายุห้าปีและอาจมีทางออกที่ดีกว่าเมื่อไม่นานมานี้
Spudley

@ SlippD.Thompson รหัสนี้ตอนนี้ที่github.com/DmitryBaranovskiy/raphaeljs.com/tree/master/github
Vadim Kotov

6

เอาท์พุทกราฟ git tablelike ที่ดีและสะอาดสำหรับเชลล์

พร้อมกับแฮชตามปกตินอกเหนือจากแผนภูมิกราฟ

พร้อมกับแฮชตามปกตินอกเหนือจากแผนภูมิกราฟ

หรือในคอลัมน์เพิ่มเติม

หรือในคอลัมน์เพิ่มเติม

แก้ไข : คุณต้องการเริ่มต้นทันทีโดยไม่ต้องอ่านคำอธิบาย? ใช้นามแฝง git, สคริปต์หรือตัวอย่างรหัสฟังก์ชั่นจากส่วนEDIT 5ด้านล่าง

ในคำตอบทั้งหมดสำหรับคำถามนี้ไม่มีผู้ใดแสดงให้เห็นถึงแท็บเล็ตที่ดูสะอาดเหมือนเดิม ที่ใกล้ที่สุดคือคำตอบนี้จากพระประวัติที่ฉันเริ่มต้น

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

นอกเหนือจากคอมไพล์คุณต้องการเครื่องมือเหล่านี้

  • grep
  • วาง
  • printf
  • sed
  • หมายเลข
  • TR
  • ห้องน้ำ

ส่วนใหญ่บนกระดานกับการกระจาย linux ใด ๆ

ข้อมูลโค้ดคือ

while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$((9-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(214)%>(15,trunc)%d%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

ในการคำนวณช่องว่างที่จำเป็นที่เราใช้

  sed -nl500 'l' <<< "$graph"

เพื่อรับอักขระทั้งหมด (จนถึง 500 ต่อบรรทัด) กว่าเลือกเฉพาะอักขระต้นไม้: * | / \ _ และช่องว่างด้วย

  grep -Eo '\\\\|\||\/|\ |\*|_'

ในที่สุดก็นับพวกมันและลบล้างผลลัพธ์จากค่าความยาวที่เราเลือกซึ่งก็คือ 9 ในตัวอย่าง

ในการผลิตจำนวนช่องว่างที่คำนวณได้ที่เราใช้

  seq -s' ' $whitespaces

และตัดทอนหมายเลขตำแหน่งด้วย

  tr -d '[:digit:]'

กว่าเพิ่มลงในส่วนท้ายของเส้นกราฟของเรา แค่นั้นแหละ!

Git มีตัวเลือกที่ดีในการจัดรูปแบบความยาวของตัวระบุผลลัพธ์ด้วยไวยากรณ์แล้ว'%><(amount_of_characters,truncate_option)'ซึ่งเพิ่ม whitespaces จากด้านซ้าย '>' หรือด้านขวา '<' และสามารถตัดอักขระจากจุดเริ่มต้น 'ltrunc', กึ่งกลาง 'mtrunc' หรือสิ้นสุด 'TRUNC'

เป็นสิ่งสำคัญที่ด้านบนของ printf cmd ใช้ค่าความยาวเท่ากันสำหรับคอลัมน์ git ที่เกี่ยวข้อง

ขอให้สนุกกับการออกแบบสไตล์แท็บเล็ตที่ดูสะอาดตาตามที่คุณต้องการ

เสริม:

ในการรับค่าความยาวที่ถูกต้องคุณสามารถใช้ตัวอย่างต่อไปนี้

while read -r graph;do
    chars=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
    [[ $chars -gt ${max_chars:-0} ]] && max_chars=$chars
done < <(git log --all --graph --pretty=format:' ')

และใช้ $ max_chars เป็นค่าความยาวที่ถูกต้องด้านบน


แก้ไข 1 : เพิ่งสังเกตเห็นว่าการขีดเส้นใต้กุศลยังใช้ในต้นไม้ git และแก้ไขโค้ดด้านบน หากมีตัวละครอื่นหายไปโปรดแสดงความคิดเห็น


แก้ไข 2 : หากคุณต้องการกำจัดวงเล็บรอบรายการสาขาและแท็กเพียงแค่ใช้ "% D" แทน "% d" ในคำสั่ง git เช่นใน EDIT 3


แก้ไข 3 : ตัวเลือกสี "อัตโนมัติ" อาจเป็นตัวเลือกที่คุณชอบมากที่สุดสำหรับรายการสาขาและแท็กใช่หรือไม่

git bracketless auto color head และ tag tablelike เชลล์เอาท์พุต

เปลี่ยนส่วนนี้ของคำสั่ง git (color 214 )

%C(214)%>(15,trunc)%D%C(reset)

เป็นอัตโนมัติ

%C(auto)%>(15,trunc)%D%C(reset)


แก้ไข 4 : หรือคุณชอบสีผสมของคุณเองสำหรับส่วนนั้นออกแฟนซีกับหัวกระพริบ?

ต้นไม้ git สไตล์ tablelike สไตล์เอาท์พุท

เพื่อให้สามารถจัดสไตล์ส่วนหัวชื่อสาขาและแท็กอันดับแรกเราต้องใช้ตัวเลือกสี "อัตโนมัติ" ในคำสั่ง git ของเราเช่นใน EDIT 3

จากนั้นเราสามารถแทนที่ค่าสีรู้ด้วยของเราเองโดยเพิ่ม 3 บรรทัดนี้

 # branch name styling
 branch=${branch//1;32m/38;5;214m}
 # head styling
 branch=${branch//1;36m/3;5;1;38;5;196m}
 # tag styling
 branch=${branch//1;33m/1;38;5;222m}

ก่อนบรรทัด

 branch_all="$branch_all$(printf '%15s' "$branch")\n"

ในข้อมูลโค้ดของเรา ค่าการแทนที่จะสร้างสีด้านบน

ตัวอย่างเช่นค่าทดแทนสำหรับหัวคือ

3;5;1;38;5;196

ที่ไหน 3; ย่อมาจากตัวเอียง 5; สำหรับการกะพริบและ 1; 38; 5; 196 สำหรับสี สำหรับข่าวสารเพิ่มเติมเริ่มที่นี่ หมายเหตุ: พฤติกรรมนี้ขึ้นอยู่กับเทอร์มินัลที่คุณชื่นชอบและอาจไม่สามารถใช้งานได้

แต่คุณสามารถเลือกค่าสีที่คุณต้องการ

ภาพรวมของค่าสี git และ ANSI ที่เทียบเท่า

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

คุณพบว่ารายการที่มีตัวเลือกสี / รูปแบบคอมไพล์ที่นี่

หากคุณต้องการเอาท์พุทบนคอนโซลของคุณสำหรับสีที่ถูกต้อง (ภาพด้านบนถูกลดขนาดลงโดย stackoverflow) คุณสามารถสร้างเอาต์พุตด้วย

for ((i=0;i<=255;i++));do
  while IFS='+' read -r tree hash;do 
    echo -e "$(printf '%-10s' "(bold $i)") $hash  $(sed -nl500 'l' <<< "$hash"|grep -Eom 1 '[0-9;]*[0-9]m'|tr -d 'm')"
  done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold '$i')%h%C(reset)'|head -n 1)
done

ในพา ธ โครงการ git ของคุณซึ่งใช้คอมมิทแรกจากไฟล์บันทึก git ของคุณ


แก้ไข 5 : ในฐานะสมาชิก "Andras Deak" กล่าวถึงมีบางวิธีวิธีการใช้รหัสนี้:

1) เป็นนามแฝง :

นามแฝงไม่ยอมรับพารามิเตอร์ แต่ฟังก์ชั่นสามารถดังนั้นเพียงกำหนดใน. bashrc ของคุณ

   function git_tably () {
     unset branch_all graph_all hash_all message_all time_all max_chars

     ### add here the same code as under "2) as a shell-script" ###

   }

และเรียกใช้ฟังก์ชัน git_tably (มาจาก tablelike) โดยตรงภายใต้พา ธ โครงการ git ของคุณหรือจากที่ใดก็ตามที่คุณต้องการด้วยพา ธ โครงการ git ของคุณเป็นพารามิเตอร์แรก

2) เป็นเปลือกสคริปต์ :

ฉันใช้มันพร้อมกับตัวเลือกในการส่งไดเรกทอรีโครงการ git เป็นพารามิเตอร์แรกให้หรือถ้าว่างให้ใช้ไดเรกทอรีการทำงานเช่นพฤติกรรมปกติ มันคือทั้งหมดที่เรามี

# edit your color/style preferences here or use empty values for git auto style
tag_style="1;38;5;222"
head_style="1;3;5;1;38;5;196"
branch_style="38;5;214"

# determine the max character length of your git tree
while IFS=+ read -r graph;do
  chars_count=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
  [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count
done < <(cd "${1:-"$PWD"}" && git log --all --graph --pretty=format:' ')

# create the columns for your prefered tablelike git graph output
while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$(($max_chars-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch=${branch//1;32m/${branch_style:-1;32}m}
  branch=${branch//1;36m/${head_style:-1;36}m}
  branch=${branch//1;33m/${tag_style:-1;33}m}
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"

done < <(cd "${1:-"$PWD"}" && git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

3) เป็นนามแฝงคอมไพล์ :

บางทีวิธีที่สะดวกสบายที่สุดคือการเพิ่มชื่อแทน git ใน. gitconfig ของคุณ

[color "decorate"]
    HEAD = bold blink italic 196
    branch = 214
    tag = bold 222

[alias]
    count-log = log --all --graph --pretty=format:' '
    tably-log = log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)'
    tably     = !bash -c '"                                                                                                    \
                  while IFS=+ read -r graph;do                                                                                 \
                    chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
                    [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count;                                          \
                  done < <(git count-log && echo);                                                                             \
                  while IFS=+ read -r graph hash time branch message;do                                                        \
                    chars=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);       \
                    whitespaces=$(($max_chars-$chars));                                                                        \
                    whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                               \
                    graph_all=\"$graph_all$graph$whitespaces\n\";                                                              \
                    hash_all=\"$hash_all$(printf \"%7s\" \"$hash\")  \n\";                                                     \
                    time_all=\"$time_all$(printf \"%12s\" \"$time\") \n\";                                                     \
                    branch_all=\"$branch_all$(printf \"%15s\" \"$branch\")\n\";                                                \
                    message_all=\"$message_all$message\n\";                                                                    \
                  done < <(git tably-log && echo);                                                                             \
                  paste -d\" \" <(echo -e \"$time_all\") <(echo -e \"$branch_all\") <(echo -e \"$graph_all\")                  \
                                <(echo -e \"$hash_all\") <(echo -e \"$message_all\");                                          \
                '"

มากกว่าแค่โทรgit tablyตามเส้นทางของโครงการ

Git มีประสิทธิภาพเพื่อให้คุณสามารถเปลี่ยนหัวแท็ก ... โดยตรงตามที่แสดงไว้ข้างต้นและนำมาจากที่นี่

อีกตัวเลือกแฟนซีคือการเลือกสีต้นไม้ที่คุณชอบมากที่สุดด้วย

[log]
    graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan

ที่ให้คุณดูบ้าคลั่ง แต่จะแสดงผลบันทึก git tablelike เสมอ

fanciest_git_tree_tablelike_image

กะพริบมากเกินไป! เพียงเพื่อแสดงให้เห็นถึงสิ่งที่เป็นไปได้ สีที่ระบุน้อยเกินไปนำไปสู่การทำซ้ำสี

การอ้างอิง. gitconfig ที่สมบูรณ์เพียงแค่คลิกเดียว

อีกครั้ง: ขอให้สนุกกับการออกแบบแท็บเล็ตที่ดูสะอาดตาตามที่คุณต้องการ


คุณควรอธิบายในคำตอบของคุณว่าคำสั่ง bash เหล่านี้จะกลายเป็นคำสั่งที่เหมือนบันทึกการคอมไพล์ได้อย่างไร เราสามารถเข้าใจถึงการใช้คำตอบที่คุณเชื่อมโยง แต่คำตอบควรอยู่ในตัวเอง
Andras Deak

คุณหมายถึงฉันควรอธิบายรายละเอียด git log cmd? หรือคุณสามารถยกตัวอย่างสิ่งที่คุณคิดถึงได้โปรด
onemorequestion

หมายเหตุ: เอาต์พุตของคำสั่ง Awesome git log ถูกใช้โดยตัวอย่างนี้เพื่อรับเอาต์พุต tablelike บนเทอร์มินัล ดังนั้นวิธีอื่น ๆ ตามที่คุณกล่าวถึง)
onemorequestion

ฉันคิดว่าคุณไม่ได้พิมพ์ bash 20 บรรทัดทุกครั้งที่คุณต้องการสิ่งนี้ มันสมเหตุสมผลที่จะนิยามสิ่งนี้ว่าเป็นฟังก์ชันทุบตีหรือนามแฝง git ผู้อ่านส่วนใหญ่จะไม่รบกวนการกรอกรหัสของคุณเพื่อให้สามารถใช้งานได้ง่าย นั่นคือสิ่งที่ฉันหมายถึง. หากคุณเพิ่งใส่รหัสในไฟล์สุ่ม sh บนเส้นทางของคุณคุณสามารถละเว้นฉัน
Andras Deak

1
ฉันเห็น. ขอบคุณสำหรับคำแนะนำของคุณ ฉันจะแก้ไขคำตอบและเพิ่มชื่อแทน ปกติฉันจะใช้ไฟล์สำหรับคำสั่ง "ยาว" ดังที่คุณพูดถึง แต่การมีทั้งสองวิธีในการเขียนที่นี่ฉันรู้สึกสบายใจมากยิ่งขึ้น
onemorequestion

5

นามแฝงบางตัวใน ~ / .oh-my-zsh / plugins / git / git.plugin.zsh

gke='\gitk --all $(git log -g --pretty=%h)'
glg='git log --stat'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glgp='git log --stat -p'
glo='git log --oneline --decorate'
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit'
glola='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit --all'

4

สำหรับผู้ใช้ OSX ฉันได้นำตัวอย่าง @gospes และปรับเปลี่ยนเล็กน้อยสำหรับ gsed ( gnu-sedติดตั้งผ่าน homebrew) และปรับสี (เพื่อทำงานกับพื้นหลังสีดำไม่แน่ใจว่าตัวอย่างดั้งเดิมอาจแสดงวิธีการในแบบ ตัวอย่างเนื่องจากมันระบุข้อความสีดำใน terminal ที่มีพื้นหลังสีดำ)

[alias]
    # tree, vtree, stree support
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(bold black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(bold black): %s%C(reset)'
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(bold black)[%cr]%C(reset)  %x09%C(bold black)%an: %s %C(reset)'
    stree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
        timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
        timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
        printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
    done < <(git logx && echo);"' | less -r
    vtree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
      timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
      timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
      printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
    done < <(git logx && echo);"' | less -r

กุญแจสำคัญสำหรับ OSX คือการติดตั้ง gnu sed ก่อน (ซึ่งมีตัวเลือก -r) ทำได้ง่ายที่สุดกับ homebrew ซึ่งจะไม่เขียนทับ sed ที่ติดตั้งระบบ แต่จะติดตั้ง gnu sed แทน "gsed" แทน หวังว่านี่จะช่วยให้ @ SlippD.Thompson ที่แสดงความคิดเห็นข้างต้นเกี่ยวกับ OSX ไม่ทำงาน

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