Bazı kitapların ve makalelerin git dallarının ve taahhütlerinin gerçekten hoş görünümlü grafiklerine sahip olduğunu gördüm. Git geçmişinin yüksek kalitede yazdırılabilir görüntülerini nasıl yapabilirim?
Bazı kitapların ve makalelerin git dallarının ve taahhütlerinin gerçekten hoş görünümlü grafiklerine sahip olduğunu gördüm. Git geçmişinin yüksek kalitede yazdırılabilir görüntülerini nasıl yapabilirim?
Yanıtlar:
Güncelleme: Bu cevap hak ettiğinden çok daha fazla dikkat çekti. Başlangıçta yayınlanmıştır, çünkü grafikler güzel görünüyor ve bir yayın için Illustrator'da çizilebiliyordu - ve daha iyi bir çözüm yoktu. Ama şimdi bu Q'ya fracz , Jubobs veya Harry Lee gibi daha uygulanabilir cevaplar var ! Lütfen yukarı çıkın !!
Güncelleme 2: Git sorusundaki Görselleştirme dalı topolojisine bu cevabın geliştirilmiş bir versiyonunu gönderdim , çünkü orada çok daha uygun. Bu sürüm , hem yazar hem de committer bilgilerini gösteren içerir lg3
, bu yüzden gerçekten kontrol etmelisiniz. Bu cevabı tarihsel nedenlerle (& itiraf edeceğim, itiraf edeceğim) neden olsa da, gerçekten silmeye cazip geldim.
Benim 2 ¢ : normalde benim ~/.gitconfig
dosya atmak iki takma adı var :
[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
şuna benzer:
ve git lg2
şuna benzer:
#202020
/ #555555
, Kırmızı: #5d1a14
/ #da4939
, Yeşil: #424e24
/ #a5c261
, Sarı: #6f5028
/ #ffc66d
, Mavi: #263e4e
/ #6d9cbe
, Macenta: #3e1f50
/ #a256c7
, Camgöbeği: #234e3f
/ #62c1a1
ve Beyaz: #979797
/ #ffffff
.
--date=relative
ve --abbrev-commit
gereksizdir, çünkü sırasıyla %cr
ve kullanırsınız %h
.
%C(auto)
etmek için değiştiriciyi refnames'e ( %d
) eklerdim . Bkz. 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
Buradaki cevapların birçoğu harika, ancak takma ad veya ekstra bir şey ayarlamak zorunda kalmadan basit bir tek satırlık cevap isteyenler için:
git log --all --decorate --oneline --graph
Herkes her zaman yapmazdı git log
, ama ihtiyacınız olduğunda hatırlayın:
" Bir köpek " = git günlük - bir ll - d ecorate - O NELINE - g Ralph
git config --global alias.adog "log --all --decorate --oneline --graph"
--all
kadar uzun ağlama üzereyim için (T_T) TEŞEKKÜRLER!
Metin çıktısı için deneyebilirsiniz:
git log --graph --abbrev-commit --decorate --date=relative --all
veya:
git log --graph --oneline --decorate --all
veya: İşte DAG grafiğini çizmek için bir grafik takma adı.
--abbrev-commit --decorate
ve sonra mükemmel!
--abbrev-commit
kullanmanız gerekmiyor--oneline
git log --graph --oneline --decorate --date=relative --all
--date
Gitgraph.js , depo olmadan güzel git dallarının çizilmesine izin verir. Sadece dallarınızı yapılandıran ve işleyen bir Javascript kodu yazıp tarayıcıda oluşturun.
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);
veya metro
şablonla:
veya taahhüt mesajları, yazarlar ve etiketlerle:
JSFiddle ile test edin .
@Bsara tarafından Git Grapher ile oluşturun .
Üstünde inşa edilen TikZ & PGF , gitdags
zahmetsizce vektör grafik grafikleri işlemek ve daha üretmesine olanak sağlayan küçük bir LaTeX paketidir.
Mevcut bir deponun taahhüt grafiğinin otomatik olarak oluşturulması aşağıdakilerin amacı değildirgitdags
; ürettiği grafikler sadece eğitim amaçlıdır .
ASCII işleme grafiklerine alternatif olarak Git sorularına yanıtlarım için grafikler üretmek için sık sık kullanıyorum:
Basit bir yeniden tabanın etkilerini gösteren böyle bir grafiğin örneği:
\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
bir dvi oluşturmak için kullandığınızı ve sonunda kullandığınızı belirtmek istedim. dvisvgm input.dvi
şeffaflık ile bir SVG oluşturmak. SVG'den PNG gibi bir raster formatına dönüştürmek oldukça kolaydır convert -antialias -density 300 -background none input.svg output.png
. Bu arada, bu görüntüler tam şeffaflıkla muhteşem görünüyor . Hala yazı tipi sorunu üzerinde çalışıyor ... i.imgur.com/1Xu2Ry5.png
gitdags
yolda!
Gitg , GNOME için Gitk ve GitX'in bir klonudur (aynı zamanda KDE'de de çalışır) ve oldukça renkli bir grafik gösterir.
Aktif olarak geliştirildi (2012 itibariyle). Taahhütleri (grafik düğümleri) kronolojik veya topolojik olarak sıralamanızı ve seçilen bir dalı oluşturmayan komutları gizlemenizi sağlar.
Büyük depolar ve karmaşık bağımlılık grafikleri ile iyi çalışır.
Linux-git ve linux-2.6 depolarını gösteren örnek ekran görüntüleri:
SourceTree gerçekten çok iyi. İyi görünümlü ve orta büyüklükte bir geçmiş ve dal grafiği yazdırır: (sadece bazı dalları görmek için deneysel bir Git projesinde aşağıdakiler yapılır). Windows 7+ ve Mac OS X 10.6+ sürümlerini destekler.
Ben sadece HTML / Canvas kullanarak grafik güzel git taahhütleri üretebilir bir araç yazdım.
Ve kullanımı kolaylaştıran bir jQuery eklentisi sağlayın.
[github] https://github.com/tclh123/commits-graph
Ön izleme:
git-forest
bir yıldan fazla bir süredir kullandığım mükemmel bir perl betiğidir ve artık git log
komutu doğrudan kullanmıyorum .
Bunlar bu senaryo hakkında sevdiğim bazı şeyler:
--reverse
Normal git log
komutla mümkün olmayan grafik çıktısıyla birleştirebilirsiniz .git log
Taahhütler listesini almak için dahili olarak kullanır , böylece git log
geçirdiğiniz tüm seçenekler de bu komut dosyasına geçirilebilir.git-forest
Aşağıdaki gibi kullanarak bir takma ad var :
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
Çıktı bir terminalde şöyle görünür:
Git günlüklerini güzel SVG grafiklerine dönüştürmek için bir web aracı yazdım: Bit-Booster - Çevrimdışı İşlem Grafiği Çizim Aracı
Çıktıyı git log --pretty='%h|%p|%d'
doğrudan araca yükleyin ve ardından "download graph.svg" bağlantısını tıklayın.
Araç tamamen istemci tarafıdır ve bu nedenle Git verilerinizin hiçbiri sunucumla paylaşılmaz. Ayrıca HTML + JS'yi yerel olarak kaydedebilir ve "file: ///" URL'lerini kullanarak çalıştırabilirsiniz. Ubuntu 12.04'te Chrome 48 ve Firefox 43'te doğrulandı.
Doğrudan herhangi bir sayfaya (blogspot bloglama motoru dahil!) Gönderilebilen HTML üretir. Blog yazılarının bazılarına bir göz atın:
http://bit-booster.blogspot.ca/
Araç tarafından oluşturulan örnek bir HTML dosyasının ekran görüntüsü:
İlgili bir sorunun cevabında bulduğum bir Graphviz betiğine dayanarak, git deposunun özet görünümünü oluşturan yakut bir betiği hackledim . Tüm lineer tarihi kullanır ve sadece "ilginç" taahhütleri gösterir, yani birden fazla ebeveyni, çok çocuğu olan veya bir şube veya etiketle gösterilenler. İşte jquery için oluşturduğu grafiğin bir parçası :
git-big-picture ve BranchMaster , bir grafiğin yalnızca üst düzey yapısını göstermeye çalışan, yalnızca etiketlerin, dalların, birleşmelerin vs. ilişkilerini görüntüleyen benzer araçlardır.
Bu sorunun başka seçenekleri de var.
Üç özel komutlar ekledik: git tree
, git stree
ve git vtree
. Bu sırayla onları aşacağım.
[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)'
İle git stree
ve git vtree
biçimlendirmeye yardımcı olmak için bash kullanıyorum.
[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: Bu git sürüm 1.9a ile çalışır. 'Auto' renk değeri görünüşe göre bu sürümde görücüye çıkıyor. Bu güzel bir ek çünkü şube isimleri farklı bir renk alacak. Bu, örneğin yerel ve uzak dallar arasında ayrım yapmayı kolaylaştırır.
fatal: bad color value 'auto' for variable '--pretty format'
:(
sed: illegal option -- r
Neye benzediklerine bağlı. Bunun gibi resimler yapan gitx kullanıyorum :
Sen karşılaştırabilirsiniz git log --graph
(aslen nereli 24 yollu ahtapot birleştirme üzerine vs gitk http://clojure-log.n01se.net/date/2008-12-24.html ):
Daha ayrıntılı metin çıktısı için lütfen şunları deneyin:
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
$ HOME / .gitconfig içinde takma ad yazabilirsiniz
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
git hist
- Mevcut şubenin geçmişini göster
git hist --all
- Tüm dalların grafiğini göster (uzaktan kumandalar dahil)
git hist master devel
- İki veya daha fazla şube arasındaki ilişkiyi göster
git hist --branches
- Tüm yerel şubeleri göster
--topo-order
Sıralamaya ekle , tarihe göre değil topolojik olarak işliyor (bu takma adda varsayılan)
--decorate
, bu nedenle farklı dal adları için ayrı renkler vargit 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 : gtk tabanlı bir depo görüntüleyicisi, bu yeni ama ilginç ve kullanışlı
http://git.gnome.org/browse/gitg
Şu anda kullanıyorum
GitX
ve oldukça iyi bir klon gibi görünüyor . Tavsiye
Bazen gitg kullanmamıza rağmen , her zaman komut satırına geri dön:
[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
Gördüğünüz gibi, aşağıdakilere dayanan neredeyse bir tuş vuruşu takma adı:
Git'in son sürümünde (1.8.5 ve üzeri)% d süslemesinde% C'den (otomatik) yararlanabilirsiniz
Buradan ihtiyacınız olan her şey, ihtiyacınız olan her şeyi filtrelemek için gitrevisions'ı iyi anlamaktır ( master..develop gibi bir şey - burada --simplify-merges uzun vadeli dallarda yardımcı olabilir)
Komut satırının arkasındaki güç, ihtiyaçlarınıza göre hızlı bir şekilde yapılandırılır (bir repo'nun benzersiz bir anahtar günlüğü yapılandırması olmadığını anlayın, bu nedenle --numstat veya --raw veya --name-status eklemek bazen gereklidir. ve takma adlar hızlı, güçlü ve (zamanla) elde edebileceğiniz en güzel grafiktir. gitgraph gibi projelerle
Slipp'in müthiş cevabını çok hafifçe değiştirerek , takma adlarını yalnızca bir dalı günlüğe kaydetmek için kullanabilirsiniz:
[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"
Kapalı bırakarak --all
şimdi yapabilirsiniz
git lgBranch1 <branch name>
ya da
git lgBranch1 --all
Git için tig
https://github.com/jonas/tig , çok daha iyi bir komut satırı aracı öneririm .
MacOS'a tig yüklemek için homebrew'u kullanabilirsiniz:
$ brew install tig
$ tig
Grafik geçmişini görüntülemek için bu git log
diğer adı var ~/.gitconfig
:
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
Bu yerinde iken, şöyle bir git l
çıktı verecektir:
Git 2.12 + 'da log.graphColors
yapılandırma seçeneğini kullanarak grafiğin çizgi renklerini bile özelleştirebilirsiniz .
Günlüklerin biçimine gelince --oneline
, yazar adının (saygılı .mailmap
) ve ilgili yazar tarihinin eklenmesiyle benzerdir . O Not %C(auto)
karma taahhüt için varsayılan renkleri kullanmak Git söyler sözdizimi, vb Git> = desteklenir 1.8.3 .
git log --graph --oneline
oneliner'ın kaybolmadığından emin olmak için
GitGraph
Git deponuzun işlem geçmişinin PNG veya SVG temsilini oluşturur.
Deneyin ditaa . Herhangi bir ASCII diyagramını bir görüntüye dönüştürebilir. Git şubeleri göz önünde bulundurularak tasarlanmamış olmasına rağmen sonuçlardan çok etkilendim.
Kaynak (txt dosyası):
+--------+
| hotfix |
+---+----+
|
--*<---*<---*
^
|
\--*<---*
|
+---+----+
| master |
+--------+
Komut:
java -jar ditaa0_9.jar ascii-graph.txt
Sonuç:
Ayrıca arka plan renklerini, kesikli çizgileri, farklı şekilleri ve daha fazlasını destekler. Örneklere bakın .
Deponuz Gitlab'da bulunuyorsa, grafik temsilini tarayıcınızda SVG olarak oluşturulmuş haliyle kullanabilirsiniz.
Deponuzun grafik görünümüne gidin, örneğin, https://gitlab.com/gitlab-org/gitter/webapp/network/develop
Grafiği aşağıya doğru kaydırın (tembel yükler devreye girer!)
SVG öğesini yeni bir dosyaya kopyalamak için tarayıcınızın denetçisini kullanın
İstediğiniz bir oluşturucuda açın, örneğin Inkscape
Doğrudan bir araç hakkında bilmiyorum, ama belki verileri nokta biçimine aktarmak ve graphviz ile işlemek için bir komut dosyasını hackleyebilirsiniz.
io
komutları basit perl `git log [...]` komutlarına dönüştürmek benim için çalıştı.
brew install perl dot
ve sonra cpan common::sense IO::all
alabilirsiniz. Sonra, çıktıyı sadece uygun bir komuta yönlendirin git-graphviz | dot -Tpng -o repo.png
. Ancak, çıktı git-big-picture'den çok farklı değildir .
Raphael web grafik kütüphanesinin demolarından biri olarak korkak bir Git işleme grafiği var .
Demo statiktir, ancak canlı bir veri kümesi için kodu alıp statik verilerini değiştirecek kadar kolay olmalıdır - bence sadece Git JSON biçimindeki verileri veriyorum.
Demo burada: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
Kabuklar için güzel ve temiz görünümlü tablelike git grafik çıktısı
grafik ağacının yanı sıra genellikle karmalarla
veya fazladan bir sütunda
Edit : Açıklamaları okumadan hemen başlamak ister misiniz? Aşağıdaki EDIT 5 bölümünden git takma adı, komut dosyası veya işlev kodu parçacıkları kullanın .
Bu sorunun tüm cevaplarında hiçbiri şu ana kadar mermiler için temiz bir tablo benzeri çıktı vermedi. En yakın ben başladığım gospes bu cevaptı .
Yaklaşımımdaki temel nokta, yalnızca kullanıcıya gösterilen ağaç karakterlerini saymaktır. Sonra beyaz boşluklarla kişisel bir uzunluğa kadar doldurun.
Git dışında bu araçlara ihtiyacınız var
çoğunlukla herhangi bir linux dağıtımı ile gemide.
Kod pasajı
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")
Kullandığımız gerekli boşluk alanlarını hesaplamak için
sed -nl500 'l' <<< "$graph"
karakterleri (satır başına 500'e kadar) almak için yalnızca ağaç karakterlerini seçin: * | / \ _ ve beyaz boşluklarla
grep -Eo '\\\\|\||\/|\ |\*|_'
nihayet onları sayın ve sonucu örnekte 9 olan seçilen uzunluk değerimizden soyutlayın.
Hesapladığımız beyaz boşluk miktarını üretmek için
seq -s' ' $whitespaces
ve konum numaralarını
tr -d '[:digit:]'
grafik çizgimizin sonuna ekleyin. Bu kadar!
Git, sözdizimi ile çıktı belirteçlerinin uzunluğunu biçimlendirmek için güzel bir seçeneğe sahiptir; '%><(amount_of_characters,truncate_option)'
bu, sol '>' veya sağ '<' tarafından boşluklar ekler ve karakterleri 'ltrunc', orta 'mtrunc' veya sondan kesebilir 'trunc'.
Bu ise önemli bir karşılık gelen git sütun için aynı uzunluk değerleri Printf cmd en yukarıdaki kullanım olduğu.
Kendi temiz tablelike çıktılarınızı ihtiyaçlarınıza göre şekillendirmek için eğlenin.
Ekstra:
Doğru uzunluk değerini almak için aşağıdaki snippet'i kullanabilirsiniz
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:' ')
ve yukarıdaki doğru uzunluk değeri olarak $ max_chars kullanın.
DÜZENLEME 1 : Sadece alt çizgi karakterinin git ağacında da kullanıldığını ve yukarıdaki kod parçacıklarını buna göre düzenlediğini fark ettim. Eksik başka karakterler varsa, lütfen yorum bırakın.
DÜZENLEME 2 : Dal ve etiket girişleri etrafındaki köşeli parantezlerden kurtulmak istiyorsanız, EDIT 3'teki gibi git komutunda "% d" yerine "% D" kullanın.
DÜZENLEME 3 : Belki "otomatik" renk seçeneği şube ve etiket girişleri için en çok tercih ettiğiniz seçenek?
Git komutunun bu bölümünü değiştirin (renk 214 )
%C(214)%>(15,trunc)%D%C(reset)
için oto
%C(auto)%>(15,trunc)%D%C(reset)
EDIT 4 : Yoksa bu parça için kendi renk karışımınızı mı, yanıp sönen kafalı süslü bir çıktı mı?
Baş, şube adları ve etiketleri biçimlendirebilmek için önce EDIT 3'teki gibi git komutumuzda "otomatik" renk seçeneğine ihtiyacımız var.
Sonra bu 3 satırı ekleyerek renk değerlerini kendi değerimizle değiştirebiliriz
# 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}
çizgiden hemen önce
branch_all="$branch_all$(printf '%15s' "$branch")\n"
kod snippet'imizde. Değiştirme değerleri yukarıdaki renkleri üretir.
Örneğin kafa için değiştirme değeri
3;5;1;38;5;196
burada 3; italik, 5; yanıp sönme için ve renk için 1; 38; 5; 196. Daha fazla bilgi için buradan başlayın. Not: Bu davranış, sık kullandığınız terminale bağlıdır ve bu nedenle kullanılamayabilir.
AMA tercih ettiğiniz herhangi bir renk değerini seçebilirsiniz.
Git renk değerleri ve ANSI eşdeğerlerine genel bakış
Git renk / stil seçeneğine sahip bir liste burada bulabilirsiniz .
Doğru renkler için konsolunuzdaki çıktıya ihtiyacınız varsa (yukarıdaki resim yığın akışı tarafından ölçeklendirilir)
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 log çıktısından ilk komutu kullanan git proje yolunuzda.
DÜZENLEME 5 : Üye "Andras Deak" belirtildiği gibi, bu kodu kullanmanın bazı yolları vardır:
1) takma ad olarak :
takma ad parametreleri kabul etmez, ancak bir işlev .bashrc dosyasında tanımlayabilir.
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 git yolunu veya ilk parametre olarak git proje yolunuzla istediğiniz yerden git_tably (tablelike'den türetilmiş) fonksiyonunu çağırın.
2) kabuk komut dosyası olarak :
Bir git proje dizinini ilk parametre olarak geçirme seçeneği ile kullanıyorum veya boşsa, çalışma dizinini normal davranış gibi alın. Bütünüyle elimizde
# 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 takma adı olarak :
Belki de en rahat yolu .gitconfig dosyanıza git takma adı eklemektir
[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\"); \
'"
Sadece git tably
herhangi bir proje yolu altında arayın .
Git o kadar güçlü ki kafa, etiketler, ... direk yukarıda gösterildiği gibi buradan alınabilir .
Bir başka süslü seçenek , en çok tercih ettiğiniz ağaç renklerini seçmektir
[log]
graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan
Bu çılgın görünümlü ama her zaman tablelike git log çıkışları verir
Çok fazla yanıp sönüyor! Sadece neyin mümkün olduğunu göstermek için. Çok az belirtilen renk, renk tekrarlarına yol açar.
Tam bir .gitconfig referansı sadece bir tık uzaklıktadır.
TEKRAR: Kendi temiz tablel görünümlü çıktılarınızı ihtiyaçlarınıza göre şekillendirmek için eğlenin.
~ / .oh-my-zsh / plugins / git / git.plugin.zsh dosyasındaki bazı takma adlar
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'
OSX kullanıcıları için, @gospes örneğini aldım ve gsed ( gnu-sed
homebrew üzerinden yüklendi) için biraz değiştirdim ve renkleri ayarladım (siyah bir arka planla çalışmak için, orijinal örneğin muhtemelen siyah arka plana sahip bir terminaldeki siyah metni belirttiği için).
[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'in anahtarı ilk olarak gnu sed (-r seçeneğine sahiptir) yüklemektir. En kolay sistem tarafından kurulan sed üzerine yazmaz, ancak bunun yerine gnu sed "gsed" olarak yükleyecek homebrew ile yapılır. Bu OSX çalışma hakkında yukarıda yorumladı @ SlippD.Thompson yardımcı olur umarım .