Ho visto alcuni libri e articoli avere alcuni grafici davvero carini di rami e commit di git. Come posso creare immagini stampabili di alta qualità della cronologia di Git?
Ho visto alcuni libri e articoli avere alcuni grafici davvero carini di rami e commit di git. Come posso creare immagini stampabili di alta qualità della cronologia di Git?
Risposte:
Aggiornamento: questa risposta ha ottenuto molta più attenzione di quanto meriti. È stato originariamente pubblicato perché penso che i grafici abbiano un bell'aspetto e possano essere disegnati in Illustrator per una pubblicazione - e non c'era soluzione migliore. Ma ora esistono molte più risposte applicabili a questa Q, come quelle di Fracz , Jubobs o Harry Lee ! Per favore, vota quelli !!
Aggiornamento 2: ho pubblicato una versione migliorata di questa risposta alla topologia del ramo Visualizzazione in domanda git , dal momento che è molto più appropriato lì. Quella versione include lg3
, che mostra sia le informazioni sull'autore che sul committer, quindi dovresti davvero verificarlo. Lasciando questa risposta per motivi storici (e rep, lo ammetterò), anche se sono davvero tentato di eliminarlo.
Il mio 2 ¢ : Ho due alias che normalmente tiro nel mio ~/.gitconfig
file:
[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
assomiglia a questo:
e si git lg2
presenta così:
#202020
/ #555555
, Rosso: #5d1a14
/ #da4939
, Verde: #424e24
/ #a5c261
, Giallo: #6f5028
/ #ffc66d
, Blu: #263e4e
/ #6d9cbe
, Magenta: #3e1f50
/ #a256c7
, Ciano: #234e3f
/ #62c1a1
e Bianco: #979797
/ #ffffff
.
--date=relative
e --abbrev-commit
sei ridondante perché usi esplicitamente %cr
e %h
, rispettivamente.
%C(auto)
modificatore a refnames ( %d
) per ottenere colori più belli. Vedi 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
Molte delle risposte qui sono fantastiche, ma per coloro che vogliono solo una semplice riga al punto rispondono senza dover impostare alias o altro, eccolo qui:
git log --all --decorate --oneline --graph
Non tutti lo farebbero git log
sempre, ma quando ne hai bisogno ricorda solo:
" A Dog " = git log - a ll - d ecorate - o neline - g raph
git config --global alias.adog "log --all --decorate --oneline --graph"
--all
così tanto tempo che sto per piangere (T_T) GRAZIE!
Per l'output testuale puoi provare:
git log --graph --abbrev-commit --decorate --date=relative --all
o:
git log --graph --oneline --decorate --all
oppure: ecco un alias graphviz per disegnare il grafico DAG.
--abbrev-commit --decorate
, e poi è perfetto!
--abbrev-commit
se si utilizza--oneline
git log --graph --oneline --decorate --date=relative --all
l' --date
argomento sia inutile. Non riesco a vedere nessuna data mostrata nel registro.
Gitgraph.js consente di disegnare rami piuttosto git senza un repository. Basta scrivere un codice Javascript che configura le filiali e le commit e renderizzarlo nel 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);
o con metro
modello:
o con messaggi di commit, autori e tag:
Generalo con Git Grapher di @bsara.
Costruito su TikZ e PGF , gitdags
è un piccolo pacchetto LaTeX che consente di produrre facilmente grafici di commit di grafica vettoriale e altro ancora.
La generazione automatica del grafico di commit di un repository esistente non è lo scopo di gitdags
; i grafici che produce sono pensati solo per scopi educativi .
Lo uso spesso per produrre grafici per le mie risposte a domande Git, in alternativa ai grafici di commit ASCII:
Ecco un esempio di tale grafico che dimostra gli effetti di un semplice rebase:
\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
per generare un dvi e infine usare dvisvgm input.dvi
per generare un SVG con trasparenza. La conversione da SVG a un formato raster come PNG è abbastanza facile con convert -antialias -density 300 -background none input.svg output.png
. A proposito, queste immagini sembrano incredibili con piena trasparenza. Stiamo
gitdags
è in arrivo!
Gitg è un clone di Gitk e GitX per GNOME (funziona anche su KDE ecc.) Che mostra un grafico piuttosto colorato.
È attivamente sviluppato (a partire dal 2012). Ti consente di ordinare i commit (nodi grafici) in ordine cronologico o topologico e nascondere i commit che non portano a un ramo selezionato.
Funziona bene con grandi repository e grafici di dipendenza complessi.
Schermate di esempio che mostrano i repository linux-git e linux-2.6:
SourceTree è davvero buono. Stampa una storia e un grafico di rami di bell'aspetto e di medie dimensioni: (Quanto segue viene fatto su un progetto Git sperimentale solo per vedere alcuni rami). Supporta Windows 7+ e Mac OS X 10.6+.
Ho appena scritto uno strumento in grado di generare un bel grafico di commit con HTML / Canvas.
E fornisci un plugin jQuery che lo rende facile da usare.
[github] https://github.com/tclh123/commits-graph
Anteprima:
git-forest
è un eccellente script perl che uso da più di un anno e non uso quasi più il git log
comando direttamente.
Queste sono alcune delle cose che amo di questo script:
--reverse
con l'output grafico, che non è possibile con il git log
comando normale .git log
internamente per afferrare l'elenco dei commit, quindi anche tutte le opzioni che passi a git log
possono essere passate a questo script.Ho un alias che usa git-forest
come segue:
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
Ecco come appare l'output su un terminale:
Ho scritto uno strumento web per convertire i log git in graziosi grafici SVG: Bit-Booster - Strumento di disegno grafico di commit offline
Carica l'output git log --pretty='%h|%p|%d'
direttamente nello strumento e fai clic sul link "download graph.svg".
Lo strumento è lato client puro, quindi nessuno dei tuoi dati Git è condiviso con il mio server. Puoi anche salvare l'HTML + JS localmente ed eseguirlo usando gli URL "file: ///". Verificato su Chrome 48 e Firefox 43 su Ubuntu 12.04.
Genera HTML che può essere pubblicato direttamente in qualsiasi pagina (incluso il motore di blog di blogspot!). Dai un'occhiata ad alcuni dei post del blog qui:
http://bit-booster.blogspot.ca/
Ecco uno screenshot di un file HTML di esempio generato dallo strumento:
http://bit-booster.com/graph.html (lo strumento)
Basato su uno script Graphviz che ho trovato in una risposta a una domanda correlata , ho creato uno script ruby che crea una vista di riepilogo di un repository git. Elimina tutta la storia lineare e mostra solo commit "interessanti", cioè quelli con più genitori, più figli o indicati da un ramo o tag. Ecco uno snippet del grafico che genera per jquery :
git-big-picture e BranchMaster sono strumenti simili che cercano di mostrare solo la struttura di alto livello di un grafico, mostrando solo come sono correlati tag, rami, fusioni, ecc.
Questa domanda ha alcune opzioni in più.
Ho aggiunto tre comandi personalizzati: git tree
, git stree
e git vtree
. Li esaminerò in questo ordine.
[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)'
Con git stree
e git vtree
ho usato bash per aiutare con la formattazione.
[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: funziona con la versione 1.9a di git. Il valore di colore "auto" sembra fare il suo debutto in questa versione. È una bella aggiunta perché i nomi dei rami avranno un colore diverso. Ciò semplifica, ad esempio, la distinzione tra filiali locali e remote.
fatal: bad color value 'auto' for variable '--pretty format'
:(
sed: illegal option -- r
Dipende da come apparivano. Uso gitx che crea immagini come questa:
Puoi confrontare git log --graph
vs. gitk su una fusione di polpo a 24 vie (originariamente da http://clojure-log.n01se.net/date/2008-12-24.html ):
Per un output testuale più dettagliato, prova:
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
Puoi scrivere alias in $ HOME / .gitconfig
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
git hist
- Mostra la storia del ramo corrente
git hist --all
- Mostra il grafico di tutti i rami (compresi i telecomandi)
git hist master devel
- Mostra la relazione tra due o più rami
git hist --branches
- Mostra tutte le filiali locali
Aggiungi --topo-order
all'ordinamento esegue il commit topologicamente, anziché per data (impostazione predefinita in questo alias)
--decorate
, quindi con colori separati per nomi di rami diversigit 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 : un visualizzatore di repository basato su gtk, che è nuovo ma interessante e utile
http://git.gnome.org/browse/gitg
lo uso attualmente
GitX
e abbastanza buono in questo. Raccomandare
Anche se a volte uso gitg , torna sempre alla riga di comando:
[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
Come puoi vedere è quasi un tasto per salvare gli alias, basato su:
Vedi nella recente versione di git (1.8.5 e successive) puoi beneficiare di% C (auto) nel segnaposto decorativo% d
Da qui tutto ciò che serve è una buona comprensione delle gitrevisions per filtrare tutto ciò di cui hai bisogno (qualcosa come master..sviluppare, dove - semplificare le fusioni potrebbe aiutare con i rami a lungo termine)
Il potere dietro la riga di comando è la rapida configurazione in base alle tue esigenze (capire che un repository non è una configurazione di registro chiave unica, quindi a volte è necessario aggiungere --numstat, - --raw o --name-status. Qui git log e gli alias sono veloci, potenti e (con il tempo) il grafico più bello che puoi ottenere. Ancora di più, con l'output mostrato per impostazione predefinita tramite un cercapersone (diciamo meno) puoi sempre cercare rapidamente i risultati. Non sei convinto? Puoi sempre analizzare il risultato con progetti come gitgraph
Modificando leggermente la fantastica risposta di Slipp , puoi usare i suoi alias per registrare solo un ramo:
[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"
Lasciando da --all
te ora puoi fare
git lgBranch1 <branch name>
o anche
git lgBranch1 --all
Suggerisco tig
https://github.com/jonas/tig
, uno strumento da riga di comando molto migliore per git.
Puoi usare homebrew per installare tig su macOS:
$ brew install tig
$ tig
Ho questo git log
alias ~/.gitconfig
per visualizzare la cronologia del grafico:
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
Con questo in atto, git l
verrà emesso qualcosa di simile:
In Git 2.12 + puoi persino personalizzare i colori delle linee del grafico usando l' log.graphColors
opzione di configurazione.
Per quanto riguarda il formato dei registri, è simile a --oneline
, con l'aggiunta del nome dell'autore (rispettando .mailmap
) e la relativa data dell'autore . Nota che la %C(auto)
sintassi, che dice a Git di usare i colori predefiniti per commit hash, ecc. È supportata in Git> = 1.8.3 .
git log --graph --oneline
solo per assicurarsi che oneliner non si perdesse
GitGraph
Genera una rappresentazione PNG o SVG della cronologia di commit del tuo repository Git.
git -c core.pager='less -SRF' log --oneline --graph --decorate
Questa è la mia variazione terminale, simile a molte risposte qui. Mi piace regolare le bandiere passate less
per impedire il ritorno a capo automatico.
Ho impostato questo su un alias per un accesso rapido poiché il comando è un po 'ingombrante.
Prova le ditaa . Può trasformare qualsiasi diagramma ASCII in un'immagine. Anche se non è stato progettato pensando ai rami Git, sono stato colpito dai risultati.
Fonte (file txt):
+--------+
| hotfix |
+---+----+
|
--*<---*<---*
^
|
\--*<---*
|
+---+----+
| master |
+--------+
Comando:
java -jar ditaa0_9.jar ascii-graph.txt
Risultato:
Supporta anche colori di sfondo, linee tratteggiate, forme diverse e altro. Vedi gli esempi .
Se il tuo repository si trova su Gitlab, puoi usare la sua rappresentazione grafica come renderizzata come SVG nel tuo browser.
Vai alla visualizzazione grafica del tuo repository, ad esempio https://gitlab.com/gitlab-org/gitter/webapp/network/develop
Scorri il grafico verso il basso (impegna carichi pigri!)
Utilizza l'ispettore del browser per copiare l'elemento SVG in un nuovo file
Aprilo in un renderer di tua scelta, ad esempio Inkscape
Non conosco uno strumento diretto, ma forse puoi hackerare uno script per esportare i dati in formato punto e renderizzarli con graphviz.
io
comandi in semplici comandi perl `git log [...]` ha funzionato per me.
brew install perl dot
e quindi cpan common::sense IO::all
ottenere le dipendenze. Quindi, reindirizza l'output a un comando appropriato, come git-graphviz | dot -Tpng -o repo.png
. Tuttavia, l'output non è molto diverso da git-big-picture .
C'è un grafico funky di commit Git come una delle demo della libreria di grafica web Raphael .
La demo è statica, ma dovrebbe essere abbastanza semplice prendere il codice e scambiare i loro dati statici con un set di dati dal vivo - penso che sia solo Git commit dati in formato JSON.
La demo è qui: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
Un output grafico git gradevole e pulito per le shell
con hash come usualmente oltre all'albero grafico
o in una colonna aggiuntiva
Modifica : vuoi iniziare subito senza leggere spiegazioni? Usa frammenti di codice alias, script o codici funzione dalla sezione EDIT 5 di seguito.
In tutte le risposte a questa domanda nessuno ha mostrato finora un risultato pulito simile a un tablel per shell. La più vicina è stata questa risposta da Gospes da cui sono partito.
Il punto centrale del mio approccio è contare solo i caratteri dell'albero mostrati all'utente. Quindi riempirli per una lunghezza personale con spazi bianchi.
Oltre a git hai bisogno di questi strumenti
principalmente a bordo con qualsiasi distribuzione linux.
Lo snippet di codice è
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")
Per calcolare gli spazi bianchi necessari che utilizziamo
sed -nl500 'l' <<< "$graph"
per ottenere tutti i caratteri (fino a 500 per riga) che selezionare solo i caratteri dell'albero: * | / \ _ e spazi bianchi con
grep -Eo '\\\\|\||\/|\ |\*|_'
infine contali e sottrai il risultato dal nostro valore di lunghezza scelto, che è 9 nell'esempio.
Per produrre la quantità calcolata di spazi bianchi che utilizziamo
seq -s' ' $whitespaces
e troncare i numeri di posizione con
tr -d '[:digit:]'
di aggiungerli alla fine della nostra linea del grafico. Questo è tutto!
Git ha la bella opzione per formattare la lunghezza degli identificatori di output già con la sintassi '%><(amount_of_characters,truncate_option)'
, che aggiunge spazi bianchi dal lato sinistro '>' o destro '<' e può troncare i caratteri dall'inizio 'ltrunc', mezzo 'mtrunc' o fine 'trunc'.
È importante che printf cmd sopra usi gli stessi valori di lunghezza per la colonna git corrispondente.
Divertiti a modellare il tuo output pulito, simile a quello di un tablel, in base alle tue esigenze.
Extra:
Per ottenere il valore di lunghezza corretto, puoi utilizzare il frammento seguente
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:' ')
e usa $ max_chars come il giusto valore di lunghezza sopra.
EDIT 1 : Ho appena notato che il carattere di sottolineatura viene usato anche nell'albero git e modifica i frammenti di codice sopra di conseguenza. Se mancano altri personaggi, lascia un commento.
EDIT 2 : Se vuoi eliminare le parentesi attorno alle voci di ramo e tag, usa "% D" invece di "% d" nel comando git, come in EDIT 3.
EDIT 3 : forse l'opzione di colore "auto" è quella che preferisci per le voci di ramo e tag?
Cambia questa parte del comando git (colore 214 )
%C(214)%>(15,trunc)%D%C(reset)
per auto
%C(auto)%>(15,trunc)%D%C(reset)
EDIT 4 : O ti piace il tuo mix di colori per quella parte, un output di fantasia con la testa lampeggiante?
Per poter dare uno stile a testa, nomi di ramo e tag, abbiamo prima bisogno dell'opzione di colore "auto" nel nostro comando git come in EDIT 3.
Quindi possiamo sostituire i valori di colore conosciuti con i nostri aggiungendo queste 3 righe
# 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}
appena prima della linea
branch_all="$branch_all$(printf '%15s' "$branch")\n"
nel nostro frammento di codice. I valori di sostituzione producono i colori sopra.
Ad esempio, il valore di sostituzione per head è
3;5;1;38;5;196
dove 3; sta per corsivo, 5; per lampeggiare e 1; 38; 5; 196 per il colore. Per maggiori informazioni inizia qui. Nota: questo comportamento dipende dal terminale preferito e potrebbe pertanto non essere utilizzabile.
MA puoi scegliere qualsiasi valore di colore che preferisci.
PANORAMICA dei valori di colore git e degli equivalenti ANSI
Puoi trovare un elenco con l' opzione git color / style qui .
Se hai bisogno dell'output sulla tua console per colori accurati (l'immagine sopra è ridimensionata dallo stackoverflow) puoi produrre l'output con
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
nel percorso del progetto git che utilizza il primo commit dall'output del log git.
EDIT 5 : Come menzionato il membro "Andras Deak", ci sono alcuni modi per utilizzare questo codice:
1) come alias :
alias non accetta parametri ma una funzione può , quindi basta definire nel tuo .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" ###
}
e chiama la funzione git_tably (derivata da tablelike) direttamente sotto il percorso del tuo progetto git o da dove vuoi con il tuo percorso del progetto git come primo parametro.
2) come shell-script :
Lo uso con l'opzione per passare una directory di progetto git come primo parametro o se vuota, prendo la directory di lavoro come il normale comportamento. Nella sua interezza abbiamo
# 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) come alias git :
Forse il modo più comodo è aggiungere un alias git nel tuo .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\"); \
'"
Basta chiamare git tably
sotto qualsiasi percorso del progetto.
Git è così potente che puoi cambiare testa, tag, ... direttamente come mostrato sopra e preso da qui .
Un'altra fantastica opzione è quella di selezionare i colori degli alberi che preferisci
[log]
graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan
che ti dà output di log git dall'aspetto pazzo ma sempre tablelike
Lampeggia troppo! Giusto per dimostrare ciò che è possibile. Troppi pochi colori specificati portano a ripetizioni di colore.
Un riferimento .gitconfig completo è a portata di clic.
ANCORA: divertiti a modellare il tuo output pulito simile a quello di un tablel secondo le tue esigenze.
alcuni alias in ~ / .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'
Per gli utenti di OSX, ho preso l'esempio di @gospes e l'ho leggermente modificato per gsed ( gnu-sed
installato tramite homebrew) e ho regolato i colori (per lavorare con uno sfondo nero, non sono sicuro di come l'esempio originale potrebbe renderlo come nel esempio poiché specifica il testo nero su un terminale con uno sfondo nero).
[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
La chiave per OSX è installare prima gnu sed (che ha l'opzione -r). Il più facilmente possibile con homebrew, che non sovrascriverà sed installato nel sistema, ma installerà invece gnu sed come "gsed". Spero che questo aiuti @ SlippD.Thompson che ha commentato sopra su OSX che non funziona.