Saya telah melihat beberapa buku dan artikel memiliki grafik git dan komitmen yang sangat cantik. Bagaimana saya bisa membuat gambar git history yang dapat dicetak berkualitas tinggi?
Saya telah melihat beberapa buku dan artikel memiliki grafik git dan komitmen yang sangat cantik. Bagaimana saya bisa membuat gambar git history yang dapat dicetak berkualitas tinggi?
Jawaban:
Pembaruan: Jawaban ini jauh lebih menarik daripada yang seharusnya. Itu awalnya diposting karena saya pikir grafik terlihat bagus dan mereka bisa ditarik di Illustrator untuk publikasi - dan tidak ada solusi yang lebih baik. Tetapi sekarang ada jawaban yang jauh lebih berlaku untuk Q ini, seperti fracz , Jubobs , atau Harry Lee ! Silakan pilih mereka !!
Pembaruan 2: Saya telah memposting versi perbaikan dari jawaban ini ke topologi cabang Visualisasi di pertanyaan git , karena jauh lebih tepat di sana. Versi itu termasuk lg3
, yang menampilkan info pembuat dan pengangkut, jadi Anda harus memeriksanya. Meninggalkan jawaban ini karena alasan historis (& perwakilan, saya akui), meskipun saya benar-benar tergoda untuk menghapusnya saja.
2 ¢ saya: Saya memiliki dua alias yang biasanya saya masukkan ke ~/.gitconfig
file saya :
[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
Saya git lg1
terlihat seperti ini:
dan git lg2
terlihat seperti ini:
#202020
/ #555555
, Merah: #5d1a14
/ #da4939
, Hijau: #424e24
/ #a5c261
, Kuning: #6f5028
/ #ffc66d
, Biru: #263e4e
/ #6d9cbe
, Magenta: #3e1f50
/ #a256c7
, Cyan: #234e3f
/ #62c1a1
, dan Putih: #979797
/ #ffffff
.
--date=relative
dan --abbrev-commit
berlebihan karena Anda secara eksplisit menggunakan %cr
dan %h
, masing-masing.
%C(auto)
modifier ke refnames ( %d
) untuk mendapatkan warna yang lebih bagus. Lihat stackoverflow.com/questions/5889878/color-in-git-log/…
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
Banyak jawaban di sini bagus, tetapi bagi mereka yang hanya menginginkan satu baris jawaban langsung tanpa harus mengatur alias atau tambahan apa pun, ini dia:
git log --all --decorate --oneline --graph
Tidak semua orang akan melakukannya git log
setiap saat, tetapi ketika Anda membutuhkannya, ingat saja:
" A Dog " = git log - sebuah ll - d ecorate - o neline - g raph
git config --global alias.adog "log --all --decorate --oneline --graph"
--all
cari begitu lama hingga saya akan menangis (T_T) TERIMA KASIH!
Untuk output teks Anda dapat mencoba:
git log --graph --abbrev-commit --decorate --date=relative --all
atau:
git log --graph --oneline --decorate --all
atau: inilah alias graphviz untuk menggambar grafik DAG.
--abbrev-commit --decorate
, dan kemudian sempurna!
--abbrev-commit
jika Anda menggunakan--oneline
git log --graph --oneline --decorate --date=relative --all
yang --date
argumen tidak berguna. Saya tidak dapat melihat tanggal yang ditampilkan di log.
Gitgraph.js memungkinkan untuk menggambar cabang-cabang git cantik tanpa repositori. Cukup tulis kode Javascript yang mengonfigurasi cabang Anda dan melakukan dan merendernya di browser.
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);
atau dengan metro
templat:
atau dengan pesan komit, penulis, dan tag:
Uji dengan JSFiddle .
Hasilkan dengan Git Grapher oleh @bsara.
Dibangun di atas TikZ & PGF , gitdags
adalah paket kecil LaTeX yang memungkinkan Anda untuk dengan mudah menghasilkan grafik vektor-komitmen, dan banyak lagi.
Pembuatan grafik komit repositori yang sudah ada secara otomatis bukanlah tujuan dari gitdags
; grafik yang dihasilkannya hanya dimaksudkan untuk tujuan pendidikan .
Saya sering menggunakannya untuk menghasilkan grafik untuk jawaban saya atas pertanyaan Git, sebagai alternatif untuk grafik komit ASCII:
Berikut adalah contoh grafik yang menunjukkan efek rebase sederhana:
\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}
:)
latex input.tex
untuk menghasilkan dvi, dan akhirnya menggunakan dvisvgm input.dvi
untuk menghasilkan SVG dengan transparansi. Konversi dari SVG ke format raster seperti PNG cukup mudah convert -antialias -density 300 -background none input.svg output.png
. Omong-omong, gambar-gambar ini terlihat luar biasa dengan transparansi penuh. Masih bekerja pada masalah font ... i.imgur.com/1Xu2Ry5.png
gitdags
sedang dalam perjalanan!
Gitg adalah tiruan dari Gitk dan GitX untuk GNOME (ini juga berfungsi pada KDE dll.) Yang menunjukkan grafik berwarna cantik.
Ini dikembangkan secara aktif (pada 2012). Ini memungkinkan Anda mengurutkan komit (grafik graph) baik secara kronologis atau topologis , dan menyembunyikan komit yang tidak mengarah ke cabang yang dipilih.
Ini berfungsi dengan baik dengan repositori besar dan grafik ketergantungan kompleks.
Contoh tangkapan layar, menampilkan repositori linux-git dan linux-2.6:
SourceTree sangat bagus. Itu memang mencetak sejarah ukuran sedang dan grafik cabang dan tampan: (berikut ini dilakukan pada proyek Git eksperimental hanya untuk melihat beberapa cabang). Mendukung Windows 7+ dan Mac OS X 10.6+.
Saya baru saja menulis satu alat yang dapat menghasilkan grafik komit git cantik menggunakan HTML / Kanvas.
Dan menyediakan plugin jQuery yang membuatnya mudah digunakan.
[github] https://github.com/tclh123/commits-graph
Pratinjau:
git-forest
adalah skrip perl yang sangat baik yang telah saya gunakan selama lebih dari satu tahun dan saya hampir tidak menggunakan git log
perintah secara langsung lagi.
Ini adalah beberapa hal yang saya sukai dari skrip ini:
--reverse
dengan output grafik, yang tidak mungkin dengan git log
perintah biasa .git log
internal untuk mengambil daftar commit, sehingga semua opsi yang Anda berikan git log
juga dapat diteruskan ke skrip ini.Saya memiliki alias menggunakan git-forest
sebagai berikut:
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
Ini adalah bagaimana output terlihat di terminal:
Saya menulis alat web untuk mengubah log git menjadi grafik SVG yang cantik: Bit-Booster - Alat Menggambar Grafik Komit Offline
Unggah output dari git log --pretty='%h|%p|%d'
langsung ke alat dan kemudian klik tautan "unduh graph.svg".
Alat ini murni sisi klien, dan tidak ada data Git Anda yang dibagikan dengan server saya. Anda juga dapat menyimpan HTML + JS secara lokal dan menjalankannya menggunakan URL "file: ///". Diverifikasi pada Chrome 48 dan Firefox 43 di Ubuntu 12.04.
Ini menghasilkan HTML yang dapat diposting langsung ke halaman mana pun (termasuk mesin blogging blogspot!). Lihatlah beberapa posting blog di sini:
http://bit-booster.blogspot.ca/
Berikut screenshot dari contoh file HTML yang dihasilkan oleh alat:
Berdasarkan skrip Graphviz yang saya temukan dalam jawaban untuk pertanyaan terkait , saya meretas skrip ruby yang membuat tampilan ringkasan repositori git. Ini menghilangkan semua sejarah linier dan hanya menunjukkan komitmen "menarik", yaitu yang memiliki banyak orang tua, banyak anak, atau ditunjukkan oleh cabang atau tag. Berikut cuplikan grafik yang dihasilkannya untuk jquery :
git-big-picture dan BranchMaster adalah alat serupa yang mencoba menunjukkan hanya struktur tingkat tinggi dari grafik, dengan hanya menampilkan bagaimana tag, cabang, penggabungan, dll terkait.
Pertanyaan ini memiliki beberapa opsi lagi.
Saya telah menambahkan tiga perintah kustom: git tree
, git stree
dan git vtree
. Saya akan membahasnya dalam urutan itu.
[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)'
Dengan git stree
dan git vtree
saya telah menggunakan bash untuk membantu memformat.
[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);"'
[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);"'
EDIT: Ini bekerja dengan git versi 1.9a. Nilai warna 'otomatis' tampaknya memulai debutnya dalam rilis ini. Ini tambahan yang bagus karena nama cabang akan mendapatkan warna yang berbeda. Ini membuatnya lebih mudah untuk membedakan antara cabang lokal dan remote misalnya.
fatal: bad color value 'auto' for variable '--pretty format'
:(
sed: illegal option -- r
Tergantung pada apa yang mereka terlihat. Saya menggunakan gitx yang membuat gambar seperti ini:
Anda dapat membandingkan git log --graph
vs gitk pada penggabungan gurita 24-arah (aslinya dari http://clojure-log.n01se.net/date/2008-12-24.html ):
Untuk output teks yang lebih rinci, silakan coba:
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
Anda dapat menulis alias di $ HOME / .gitconfig
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
git hist
- Tampilkan riwayat cabang saat ini
git hist --all
- Tampilkan grafik semua cabang (termasuk remote)
git hist master devel
- Tunjukkan hubungan antara dua atau lebih cabang
git hist --branches
- Tampilkan semua cabang lokal
Menambahkan --topo-order
untuk mengurutkan komit secara topologis, bukan berdasarkan tanggal (default dalam alias ini)
--decorate
, jadi dengan warna terpisah untuk nama cabang yang berbedagit 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)'"
gitg : penampil repositori berbasis gtk, itu baru tapi menarik dan bermanfaat
http://git.gnome.org/browse/gitg
Saya menggunakannya saat ini
GitX
dan cukup bagus. Rekomendasikan
Meskipun terkadang saya menggunakan gitg , selalu kembali ke baris perintah:
[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
Seperti yang Anda lihat, hampir merupakan alias hemat tombol, berdasarkan:
Lihat di git versi terbaru (1.8.5 ke atas) Anda bisa mendapat manfaat dari% C (otomatis) dalam menghias placeholder% d
Dari sini yang Anda butuhkan adalah pemahaman yang baik tentang gitrevision untuk menyaring apa pun yang Anda butuhkan (seperti master..develop, di mana --simplify-merge dapat membantu cabang-cabang jangka panjang)
Kekuatan di belakang baris perintah adalah konfigurasi cepat berdasarkan kebutuhan Anda (memahami repo bukan konfigurasi log kunci yang unik, sehingga menambahkan --numstat, atau --raw, atau --name-status kadang-kadang diperlukan. Di sini git log dan alias cepat, kuat, dan (seiring waktu) grafik tercantik yang dapat Anda capai, bahkan lebih lagi, dengan output yang ditunjukkan secara default melalui pager (katakan kurang) Anda selalu dapat mencari dengan cepat di dalam hasil. Tidak yakin? Anda selalu dapat menguraikan hasilnya dengan proyek-proyek seperti gitgraph
Sangat sedikit mengutak-atik jawaban Slipp yang luar biasa , Anda dapat menggunakan aliasnya untuk login hanya satu cabang:
[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"
Dengan meninggalkan --all
Anda sekarang dapat melakukannya
git lgBranch1 <branch name>
atau bahkan
git lgBranch1 --all
Saya menyarankan tig
https://github.com/jonas/tig
, alat baris perintah yang jauh lebih baik untuk git.
Anda dapat menggunakan homebrew untuk menginstal tig di macOS:
$ brew install tig
$ tig
Saya memiliki git log
alias ini ~/.gitconfig
untuk melihat riwayat grafik:
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
Dengan ini di tempat, git l
akan menampilkan sesuatu seperti:
Di Git 2.12 + Anda bahkan dapat menyesuaikan warna garis grafik menggunakan log.graphColors
opsi konfigurasi.
Adapun format log, mirip dengan --oneline
, dengan penambahan nama penulis (menghormati .mailmap
) dan tanggal relatif penulis . Perhatikan bahwa %C(auto)
sintaks, yang memberi tahu Git untuk menggunakan warna default untuk komit hash, dll. Didukung di Git> = 1.8.3 .
git log --graph --oneline
hanya untuk memastikan penumpang tidak tersesat
GitGraph
Menghasilkan representasi PNG atau SVG dari riwayat komit Git Anda.
git -c core.pager='less -SRF' log --oneline --graph --decorate
Ini adalah variasi terminal saya, mirip dengan banyak jawaban di sini. Saya suka menyesuaikan bendera yang dilewati less
untuk mencegah pembungkus kata.
Saya mengatur ini ke alias untuk akses cepat karena perintahnya agak rumit.
Coba ditaa . Itu dapat mengubah diagram ASCII menjadi gambar. Meskipun tidak dirancang dengan mempertimbangkan cabang Git, saya terkesan dengan hasilnya.
Sumber (file txt):
+--------+
| hotfix |
+---+----+
|
--*<---*<---*
^
|
\--*<---*
|
+---+----+
| master |
+--------+
Perintah:
java -jar ditaa0_9.jar ascii-graph.txt
Hasil:
Ini juga mendukung warna latar belakang, garis putus-putus, berbagai bentuk dan banyak lagi. Lihat contohnya .
Jika repositori Anda berada di Gitlab, Anda dapat menggunakan representasi grafiknya seperti yang disajikan sebagai SVG di browser Anda.
Pergi ke tampilan grafik repositori Anda, misalnya https://gitlab.com/gitlab-org/gitter/webapp/network/develop
Gulir grafik ke bawah (itu malas memuat komit!)
Gunakan inspektur browser Anda untuk menyalin elemen SVG ke file baru
Buka di renderer pilihan Anda, misalnya Inkscape
Saya tidak tahu tentang alat langsung, tapi mungkin Anda bisa meretas skrip untuk mengekspor data ke dalam format dot dan merendernya dengan graphviz.
io
perintah - perintah itu menjadi perintah sederhana perl `git log [...]` bekerja untuk saya.
brew install perl dot
dan kemudian cpan common::sense IO::all
mendapatkan dependensinya. Kemudian, hanya pipa output ke perintah yang sesuai, seperti git-graphviz | dot -Tpng -o repo.png
. Namun, outputnya tidak jauh berbeda dengan git-big-picture .
Ada grafik komit Git yang funky sebagai salah satu demo dari perpustakaan grafik web Raphael .
Demo ini statis, tetapi harus cukup mudah untuk mengambil kode dan menukar data statis mereka dengan data live - Saya pikir itu hanya data komit Git dalam format JSON.
Demo ada di sini: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
Output grafik git mirip tablelike yang bagus dan bersih untuk shell
dengan hash seperti biasa selain pohon grafik
atau di kolom tambahan
Sunting : Anda ingin segera memulai tanpa membaca penjelasan? Gunakan git alias, skrip atau cuplikan kode fungsi dari bagian EDIT 5 di bawah ini.
Dalam semua jawaban atas pertanyaan ini, tidak ada yang menunjukkan output mirip shell yang terlihat bagus untuk shell sejauh ini. Yang paling dekat adalah jawaban dari gospes tempat saya memulai.
Titik inti dalam pendekatan saya adalah hanya menghitung karakter pohon yang ditampilkan kepada pengguna. Kemudian isi mereka hingga panjang pribadi dengan spasi putih.
Selain git Anda membutuhkan alat ini
sebagian besar di papan dengan distribusi linux.
Cuplikan kode adalah
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")
Untuk menghitung spasi putih yang dibutuhkan, kami menggunakan
sed -nl500 'l' <<< "$graph"
untuk mendapatkan semua karakter (hingga 500 per baris) daripada hanya memilih karakter pohon: * | / \ _ dan spasi putih dengan
grep -Eo '\\\\|\||\/|\ |\*|_'
akhirnya hitung dan kurangi hasilnya dari nilai panjang pilihan kami, yaitu 9 pada contoh.
Untuk menghasilkan jumlah spasi putih yang kami gunakan
seq -s' ' $whitespaces
dan potong nomor posisi dengan
tr -d '[:digit:]'
daripada menambahkannya ke akhir garis grafik kami. Itu dia!
Git memiliki opsi yang bagus untuk memformat panjang specifier yang sudah ada dengan sintaks '%><(amount_of_characters,truncate_option)'
, yang menambahkan spasi putih dari sisi '>' atau kanan '<' kiri dan dapat memotong karakter dari awal 'ltrunc', tengah 'mtrunc' atau akhir 'terpotong'.
Hal ini penting bahwa penggunaan atas printf cmd ini nilai panjang yang sama untuk kolom git yang sesuai.
Bersenang-senang untuk merancang keluaran tampak seperti tablel Anda sendiri bersih untuk kebutuhan Anda.
Tambahan:
Untuk mendapatkan nilai panjang yang tepat, Anda dapat menggunakan cuplikan berikut
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:' ')
dan gunakan $ max_chars sebagai nilai panjang yang tepat di atas.
EDIT 1 : Hanya perhatikan bahwa karakter garis bawah juga digunakan di pohon git dan edit cuplikan kode di atas. Jika ada karakter lain yang hilang, silakan tinggalkan komentar.
EDIT 2 : Jika Anda ingin menghilangkan tanda kurung di sekitar entri cabang dan tag, cukup gunakan "% D" alih-alih "% d" dalam perintah git, seperti pada EDIT 3.
EDIT 3 : Mungkin opsi warna "otomatis" adalah yang paling Anda sukai untuk entri cabang dan tag?
Ubah bagian ini dari perintah git (warna 214 )
%C(214)%>(15,trunc)%D%C(reset)
ke otomatis
%C(auto)%>(15,trunc)%D%C(reset)
EDIT 4 : Atau Anda suka campuran warna Anda sendiri untuk bagian itu, output mewah dengan kepala berkedip?
Untuk dapat mendesain kepala, nama cabang dan tag terlebih dahulu kita membutuhkan opsi warna "otomatis" dalam perintah git kita seperti pada EDIT 3.
Kemudian kita bisa mengganti nilai warna know dengan kita sendiri dengan menambahkan 3 baris ini
# 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}
sebelum baris
branch_all="$branch_all$(printf '%15s' "$branch")\n"
dalam cuplikan kode kami. Nilai penggantian menghasilkan warna di atas.
Misalnya nilai penggantian kepala adalah
3;5;1;38;5;196
dimana 3; singkatan dari italic, 5; untuk berkedip dan 1; 38; 5; 196 untuk warnanya. Untuk info lebih lanjut mulai dari sini. Catatan: Perilaku ini tergantung pada terminal favorit Anda dan karena itu mungkin tidak dapat digunakan.
TETAPI Anda dapat memilih nilai warna apa pun yang Anda inginkan.
GAMBARAN UMUM nilai git color dan setara ANSI
Anda menemukan daftar dengan opsi git color / style di sini .
Jika Anda membutuhkan output pada konsol Anda untuk warna yang akurat (gambar di atas diperkecil oleh stackoverflow), Anda dapat menghasilkan output dengan
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
di jalur proyek git Anda yang menggunakan komit pertama dari keluaran log git Anda.
EDIT 5 : Seperti yang disebutkan anggota "Andras Deak", ada beberapa cara bagaimana menggunakan kode ini:
1) sebagai alias :
alias tidak menerima parameter tetapi fungsi bisa , oleh karena itu tetapkan saja .bashrc Anda
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" ###
}
dan panggil fungsi git_tably (berasal dari tablelike) langsung di bawah jalur proyek git Anda atau dari mana pun Anda inginkan dengan jalur proyek git Anda sebagai parameter pertama.
2) sebagai skrip shell :
Saya menggunakannya dengan opsi untuk meneruskan direktori proyek git sebagai parameter pertama atau jika kosong, ambil direktori kerja seperti perilaku normal. Secara keseluruhan kami miliki
# 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) sebagai alias git :
Mungkin cara paling nyaman adalah menambahkan alias git di .gitconfig Anda
[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\"); \
'"
Daripada menelepon di git tably
bawah jalur proyek apa pun.
Git sangat kuat sehingga Anda dapat mengubah kepala, tag, ... langsung seperti yang ditunjukkan di atas dan diambil dari sini .
Opsi mewah lainnya adalah memilih warna pohon yang paling Anda sukai
[log]
graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan
yang memberi Anda tampilan log git log yang tampak gila tapi selalu seperti tab
Terlalu banyak kedipan! Hanya untuk menunjukkan apa yang mungkin. Terlalu sedikit warna yang ditentukan menyebabkan pengulangan warna.
Referensi .gitconfig yang lengkap hanya dengan satu klik saja.
LAGI: Bersenang-senanglah untuk mendesain sendiri tampilan yang mirip tablelike dengan kebutuhan Anda.
beberapa alias di ~ / .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'
Untuk pengguna OSX, saya telah mengambil contoh @gospes dan sedikit memodifikasinya untuk gsed ( gnu-sed
diinstal melalui homebrew) dan menyesuaikan warna (untuk bekerja dengan latar belakang hitam, tidak yakin bagaimana contoh asli dapat membuat seperti di dalam contoh karena ia menetapkan teks hitam pada terminal dengan latar belakang hitam).
[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
Kunci untuk OSX adalah menginstal gnu sed (yang memiliki opsi -r). Paling mudah dilakukan dengan homebrew, yang tidak akan menimpa sistem yang diinstal sed, tetapi sebaliknya akan menginstal gnu sed sebagai "gsed". Semoga ini bisa membantu @ SlippD. Thompson yang berkomentar di atas tentang OSX tidak berfungsi.