He visto algunos libros y artículos que tienen gráficos muy bonitos de ramas y commits de git. ¿Cómo puedo hacer imágenes imprimibles de alta calidad del historial de git?
¿Está buscando una herramienta para visualizar su propio historial de git, o una herramienta de gráficos que tenga una manera de dibujar bonitas "ramas de Git"?
Eliminaría la etiqueta dirígete a gráficos acíclicos porque es irrelevante para esta pregunta
Maksim Dmitriev
Respuestas:
1843
Actualización: esta respuesta ha recibido mucha más atención de la que merece. Originalmente se publicó porque creo que los gráficos se ven bien y podrían dibujarse en Illustrator para una publicación, y no había una mejor solución. ¡Pero ahora existen respuestas mucho más aplicables a esta Q, como las de Frazz , Jubobs o Harry Lee ! ¡Por favor, vota a esos!
Actualización 2: publiqué una versión mejorada de esta respuesta a la topología de rama Visualizing en la pregunta git , ya que es mucho más apropiado allí. Esa versión incluye lg3, que muestra tanto la información del autor como la del confirmador, por lo que realmente debería consultarla. Dejando esta respuesta por razones históricas (y rep, lo admito), aunque estoy realmente tentado de eliminarla.
Mis 2 ¢ : Tengo dos alias que normalmente incluyo en mi ~/.gitconfigarchivo:
Sí lo hago. Los colores normales y brillantes / audaces son: negro #202020/ #555555, rojo: #5d1a14/ #da4939, verde: #424e24/ #a5c261, amarillo: #6f5028/ #ffc66d, azul: #263e4e/ #6d9cbe, magenta: #3e1f50/ #a256c7, cian: #234e3f/ #62c1a1y blanco: #979797/ #ffffff.
Slipp D. Thompson
3
@Turbo: Para mí, los colores se pueden cambiar en la configuración del perfil de mi aplicación de terminal (Terminal.app). La aplicación de terminal que está utilizando puede o no admitir el cambio de los colores que se muestran para determinados colores ANSI. Además, el guión (em dash, con precisión) se creó con la opción shift-[guión-menos clave]. Supongo que supuse erróneamente que todas las plataformas actuales estaban a la altura de Unicode.
Slipp D. Thompson
3
Tu --date=relativey --abbrev-commitson redundantes porque utilizas explícitamente %cry %h, respectivamente.
Gran respuesta. He modificado el comando para que se parezca más a la salida de --oneline --decorate withlg = 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
1200
Muchas de las respuestas aquí son geniales, pero para aquellos que solo quieren una respuesta simple de una línea al punto sin tener que configurar alias ni nada extra, aquí está:
git log --all --decorate --oneline --graph
No todos lo harían git logtodo el tiempo, pero cuando lo necesites solo recuerda:
" A Dog " = git log - a ll - d ecorate - o neline - g raph
Añadiría --abbrev-commit --decorate, ¡y luego es perfecto!
asimétrico
66
--abbrev-commit está implícito en --oneline, ¿no?
dwineman
44
@dwineman sí, no necesitas --abbrev-commitsi lo usas--oneline
Thomas
2
Parece que en su segunda línea git log --graph --oneline --decorate --date=relative --allel --dateargumento es inútil. No puedo ver ninguna fecha mostrada en el registro.
Lerner Zhang
la fecha no se muestra cuando se especifica
--oneline
253
Gitgraph.js permite dibujar bonitas ramas git sin un repositorio. Simplemente escriba un código Javascript que configure sus ramas y confirmaciones y renderícelo en el navegador.
Sin embargo, las flechas deben apuntar a los padres, no a los niños.
jub0bs
44
@Jubobs: Buen punto. Ese es un obstáculo común para las personas que intentan entender a Git: piensan en la secuencia del tiempo en lugar de la herencia. Dejar en claro que (casi) todo en git es relativo a algo anterior ayuda a que todas las otras piezas encajen en su lugar.
Slipp D. Thompson
66
Con respecto a la dirección de la flecha, desde los documentos: * @param {Boolean} [options.reverseArrow = false] - Hacer que las flechas apunten a los antepasados si es cierto
Scott
2
Para su información, después de ver esta publicación y jugar con gitgraph.js, decidí crear una pequeña herramienta que básicamente ponga una interfaz de usuario en gitgraph.js. No está terminado, y la interfaz de usuario aún no está donde quiero que esté, ¡pero las contribuciones son bienvenidas! eche un vistazo: github.com/bsara/git-grapher
bsara
123
Construido sobre TikZ y PGF , gitdagses un pequeño paquete de LaTeX que le permite producir sin esfuerzo gráficos de confirmación de gráficos vectoriales, y más.
La generación automática del gráfico de confirmación de un repositorio existente no es el propósito de gitdags; los gráficos que produce son solo para fines educativos .
A menudo lo uso para producir gráficos para mis respuestas a las preguntas de Git, como alternativa a los gráficos de compromiso ASCII:
Aquí hay un ejemplo de dicho gráfico que demuestra los efectos de un simple 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}
@¡Eso se ve genial! También me gustaría tener algunas líneas sobre cómo usarlo: considere un usuario de Windows que no tiene instalado LaTeX. ¿Cómo producir un gráfico desde cero?
VonC
1
@VonC No estoy seguro, pero si no desea instalar LaTeX, es posible que pueda producir sus gráficos en ShareLatex y WriteLaTeX , y similares . Lo examinaré y expandiré el wiki cuando tenga más tiempo ... Siéntase libre de promocionar el paquete:)
jub0bs
¡Esto es genial! Escribiré un tutorial en algún momento, pero por ahora, solo quería mencionar que puede procesar posteriormente sus gráficos usando la clase de documento independiente (uso la función de recorte), usar latex input.texpara generar un dvi, y finalmente usar dvisvgm input.dvipara generar un SVG con transparencia. Convertir desde el SVG a un formato ráster como PNG es bastante fácil con convert -antialias -density 300 -background none input.svg output.png. Por cierto, estas imágenes se ven increíbles con total transparencia. Todavía estoy
Gitg es un clon de Gitk y GitX para GNOME (también funciona en KDE, etc.) que muestra un gráfico bastante coloreado.
Se desarrolla activamente (a partir de 2012). Le permite ordenar las confirmaciones (nodos de gráficos) cronológica o topológicamente , y ocultar las confirmaciones que no conducen a una rama seleccionada.
Funciona bien con repositorios grandes y gráficos de dependencia complejos.
Capturas de pantalla de muestra, que muestran los repositorios linux-git y linux-2.6:
Se ve bien, ¿cómo se obtienen datos preformateados para dibujar este gráfico?
Olga
3
@ Olga Acabo de agregar el código de back-end a mi repositorio. Se puede ver que en github.
Harry Lee
60
Sourcetree es realmente bueno. Imprime un historial atractivo y de tamaño mediano y un gráfico de rama: (lo siguiente se hace en un proyecto experimental de Git solo para ver algunas ramas). Admite Windows 7+ y Mac OS X 10.6+.
También está disponible en App Store, por lo que la actualización debería funcionar automáticamente.
WebOrCode
Me encanta el gráfico de sourcetree, pero prefiero usar la línea de comandos, y los valores predeterminados de sourcetree siempre se meten con mis repositorios.
SgtPooki
SourceTree insistiría en que cree una cuenta de Atlassian (o use su cuenta de Google y le otorgue a Atlassian algunos permisos para obtener su correo electrónico e información de perfil), y después de instalar en Mac (OS X El Capitan v 10.11.5) falla en el paso 'Clonación': "fatal: no se encontró mapeo de submódulos en .gitmodules para la ruta '<ruta omitida>'" y también una advertencia extraña: "plantillas no encontradas / usr / local / git / share / git-core / templates". Mensajes muy oscuros, no tan geniales.
Dmitry Shevkoplyas
3
Y luego, después de la desinstalación, no olvide ordenar sus privilegios de seguridad de Google que otorgó anteriormente: myaccount.google.com/security -> Aplicaciones y sitios conectados -> Aplicaciones conectadas a su cuenta -> Administrar aplicaciones
Dmitry Shevkoplyas
56
git-forestes un excelente script perl que he estado usando durante más de un año y ya casi no uso el git logcomando directamente.
Estas son algunas de las cosas que me encantan de este script:
Utiliza caracteres unicode para dibujar las líneas en el gráfico, lo que le da un aspecto más continuo a las líneas del gráfico.
Puede combinarse --reversecon la salida del gráfico, que no es posible con el git logcomando regular .
Se usa git loginternamente para obtener la lista de confirmaciones, por lo que todas las opciones que pasa git logtambién se pueden pasar a este script.
Tengo un alias usando git-forestlo siguiente:
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
@ void.pointer: sí, no lo hará porque git-forest es un script perl y tiene dependencias del módulo perl. Ejecutar git bajo cygwin con los módulos perl necesarios instalados podría ser la mejor alternativa que podría obtener si realmente quiere esto en Windows :)
Tuxdude
1
Wow, ese repositorio tiene muchas herramientas geniales. ¡Gracias!
Eldelshell
1
Funciona perfectamente bien @MinGW (MSYS) en Win $; instalar CPANM; luego Git.pm; crea un alias y estás listo para comenzar.
Sektor
¿Cuál es ese emulador de terminal muy bueno que usas? Me gustan las cosas del indicador gráfico rápido.
Subir salida de git log --pretty='%h|%p|%d' directamente en la herramienta y luego haga clic en el enlace "descargar graph.svg".
La herramienta es del lado del cliente puro, por lo que ninguno de sus datos de Git se comparte con mi servidor. También puede guardar el HTML + JS localmente y ejecutarlo usando URL "file: ///". Verificado en Chrome 48 y Firefox 43 en Ubuntu 12.04.
Genera HTML que se puede publicar directamente en cualquier página (¡incluido el motor de blogs blogspot!). Echa un vistazo a algunas de las publicaciones del blog aquí:
@ Jay parece que el color refleja el nivel de sangría de esa rama en particular, y que las ramas pueden moverse a otra columna y, por lo tanto, cambiar de color.s
Thorbjørn Ravn Andersen
44
Basado en un script Graphviz que encontré en una respuesta a una pregunta relacionada , he pirateado un script ruby que crea una vista de resumen de un repositorio git. Elimina toda la historia lineal y solo muestra confirmaciones "interesantes", es decir, aquellas con múltiples padres, múltiples hijos o señaladas por una rama o etiqueta. Aquí hay un fragmento del gráfico que genera para jquery :
git-big-picture y BranchMaster son herramientas similares que intentan mostrar solo la estructura de alto nivel de un gráfico, al mostrar solo cómo se relacionan las etiquetas, ramas, fusiones, etc.
Intenté esto, pero no pude hacer que el punto funcionara correctamente con la salida para nuestro repositorio (42 ramas, 175 etiquetas, 42,000 confirmaciones) ... Lástima ... ¡Eso es exactamente lo que estaba buscando!
Xavier Nodet
1
@XavierNodet, si su repositorio es público y / o tiene un mensaje de error, etc., presente un problema en GitHub. ¡Gracias!
Matt McHenry
38
He añadido tres comandos personalizados: git tree, git streey git vtree. Los revisaré en ese orden.
EDITAR: Esto funciona con git versión 1.9a. El valor de color 'auto' aparentemente está haciendo su debut en este lanzamiento. Es una buena adición porque los nombres de las ramas tendrán un color diferente. Esto facilita la distinción entre ramas locales y remotas, por ejemplo.
fatal: bad color value 'auto' for variable '--pretty format':(
Giratorio
Resultó ser una versión antigua de git. Yum tiene una versión bastante desactualizada de Git en su repositorio. Compilado de la fuente (1.9) y funciona muy bien. ¡También es hermoso! Gracias @gospes!
Giratorio
No vaya a OS X:sed: illegal option -- r
Slipp D. Thompson
@ SlippD.Thompson: estoy usando Linux :). El -r es para expresiones regulares extendidas. Aparentemente, la versión OSX de sed no lo tiene. Quizás puedas actualizar sed. De lo contrario, puede volver a escribir el comando sed sin regex extendido.
gospes
1
Para Mac OS X sed, use -E en lugar de -r
Baxter Lopez
37
Depende de cómo se veían. Yo uso gitx que hace fotos como esta:
Es gracioso ... ¡Hubiera jurado que te escuché decir "combinación de pulpo de 24 vías"!
dty
44
Por curiosidad, ¿alguien ha intentado extraer las rutinas de dibujo de GitX (u otra herramienta GUI git) en un ejecutable independiente? Si no me equivoco, hacer que Cocoa se dibuje en un archivo PDF vectorial no sería difícil y satisfaría la necesidad del OP de imágenes imprimibles de alta Q.
Slipp D. Thompson
Estaba en S3 vía skitch antes de que rehicieran lo suyo. Ojalá todavía lo tuviera. :(
Dustin
Simplemente lo reemplacé con una versión gitk de lwn.net/images/ns/kernel/gitk-octopus.png , vinculada desde clojure-log.n01se.net/date/2008-12-24.html . @Dustin: espero que esté bien. No es la misma imagen, pero tiene un propósito similar. De la captura de pantalla, parece que es parte del kernel de Linux, así que supongo que podrías encontrar esa confirmación y volver a tomar una captura de pantalla equivalente de gitx ...
Como puede ver, es casi un alias para guardar pulsaciones de teclas, basado en:
--color: aspecto claro
- gráfico: visualizar padres
--date-order: el aspecto más comprensible en el repositorio
--decorar: quien es quien
--en línea: muchas veces todo lo que necesitas saber sobre un commit
- simplificar por decoración: básico para un primer vistazo (solo etiquetas, fusiones relevantes, ramas)
--todos: guardar pulsaciones de teclas con todos los alias con y sin esta opción
--date = relative (% ar): comprende la actividad en el repositorio (a veces una rama tiene pocos commits cerca del master pero hace meses de él)
Consulte en la versión reciente de git (1.8.5 y superior) que puede beneficiarse de% C (automático) en el marcador de posición de decoración% d
Desde aquí, todo lo que necesita es una buena comprensión de gitrevisions para filtrar lo que necesite (algo así como master..develop, donde --simplify-merges podría ayudar con ramas a largo plazo)
El poder detrás de la línea de comando es la configuración rápida basada en sus necesidades (comprenda que un repositorio no es una configuración de registro de clave única, por lo que a veces es necesario agregar --numstat, o --raw, o --name-status. Aquí git log y los alias son rápidos, potentes y (con el tiempo) el gráfico más bonito que puede lograr. Aún más, con la salida mostrada por defecto a través de un localizador (digamos menos) siempre puede buscar rápidamente dentro de los resultados. ¿No está convencido? Siempre puede analizar el resultado con proyectos como gitgraph
Muy agradable. Agregar estos a mi configuración. Pero recomiendo cambiar% Cred% d% Creset para que sea% C (automático)% d% Creset, que dará diferentes colores para nombres de sucursales remotas o locales
En Git 2.12 + puedes incluso personalizar los colores de línea del gráfico usando la log.graphColorsopción de configuración.
En cuanto al formato de los registros, es similar a --oneline, con la adición del nombre del autor (respetando .mailmap) y la fecha relativa del autor . Tenga en cuenta que la %C(auto)sintaxis, que le dice a Git que use los colores predeterminados para commit hash, etc., es compatible con Git> = 1.8.3 .
Prueba ditaa . Puede transformar cualquier diagrama ASCII en una imagen. Aunque no se diseñó teniendo en cuenta las ramas de Git, los resultados me impresionaron.
Pruebe este github.com/gugod/bin/blob/master/git-graphviz . No tenía todas las dependencias en mi entorno corporativo, por lo que cambiar esos iocomandos a simples comandos perl `git log [...]` funcionó para mí.
Ross Rogers
Si estás en una Mac y quieres probar este script, puedes tomar perl brew install perl doty luego cpan common::sense IO::allobtener las dependencias. Luego, simplemente canalice la salida a un comando apropiado, como git-graphviz | dot -Tpng -o repo.png. Sin embargo, el resultado no es muy diferente al de git-big-picture .
jrhorn424
6
Hay un gráfico de compromiso Git funky como una de las demos de la biblioteca de gráficos web Raphael .
La demostración es estática, pero debería ser bastante fácil tomar el código e intercambiar sus datos estáticos por un conjunto de datos en vivo; creo que son solo datos de confirmación de Git en formato JSON.
@Sven: Gracias por señalar eso. He corregido los enlaces rotos para usted, aunque tenga en cuenta que esta respuesta tiene cinco años y, por lo tanto, puede haber una solución mejor más recientemente.
Una salida de gráfico git similar a una tabla agradable y limpia para conchas
con hashes habitualmente además del árbol de gráficos
o en una columna extra
Editar : ¿Quieres comenzar de inmediato sin leer las explicaciones? Use fragmentos de código de alias, script o funciones de git de la sección EDIT 5 a continuación o incluso la forma más cómoda con EDIT 6 .
Hasta ahora, en todas las respuestas a esta pregunta, ninguna mostró un resultado de aspecto de tabla limpio para los depósitos. Lo más cercano fue esta respuesta de los evangelios desde donde comencé.
El punto central de mi enfoque es contar solo los caracteres del árbol que se muestran al usuario. Luego, llénelos a una longitud personal con espacios en blanco.
Aparte de git, necesitas estas herramientas
grep
pegar
printf
sed
seq
tr
baño
principalmente a bordo con cualquier distribución de Linux.
El fragmento de código es
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")
Para calcular los espacios en blanco necesarios usamos
sed -nl1000 'l' <<< "$graph"
para obtener todos los caracteres (hasta 1000 por línea) que seleccione solo los caracteres del árbol: * | / \ _ y espacios en blanco con
grep -Eo '\\\\|\||\/|\ |\*|_'
finalmente contarlos y restar el resultado de nuestro valor de longitud elegido, que es 9 en el ejemplo.
Para producir la cantidad calculada de espacios en blanco utilizamos
seq -s' ' $whitespaces
y truncar los números de posición con
tr -d '[:digit:]'
que agregarlos al final de nuestra línea gráfica. ¡Eso es!
Git tiene la buena opción de formatear la longitud de los especificadores de salida ya con la sintaxis'%><(amount_of_characters,truncate_option)' , que agrega espacios en blanco desde el lado izquierdo '>' o derecho '<' y puede truncar caracteres desde el inicio 'ltrunc', 'mtrunc' medio o final 'trunc'.
Es importante que los cmd de printf anteriores usen los mismos valores de longitud para la columna git correspondiente.
Diviértete para diseñar tu propia salida de aspecto limpio a tus necesidades.
Extra:
Para obtener el valor de longitud correcto, puede usar el siguiente fragmento
y use $ max_chars como el valor de longitud correcto arriba.
EDITAR 1 : Acabo de notar que el carácter subrayado también se usa en el árbol git y edita los fragmentos de código anteriores en consecuencia. Si faltan otros caracteres, deje un comentario.
EDIT 2 : si desea deshacerse de los corchetes alrededor de las entradas de rama y etiqueta, simplemente use "% D" en lugar de "% d" en el comando git, como en EDIT 3.
EDITAR 3 : ¿Quizás la opción de color "automático" es la que más prefiere para las entradas de rama y etiqueta?
Cambiar esta parte del comando git (color 214 )
%C(214)%>(15,trunc)%D%C(reset)
a auto
%C(auto)%>(15,trunc)%D%C(reset)
EDIT 4 : ¿O te gusta tu propia mezcla de colores para esa parte, una salida elegante con cabeza parpadeante?
Para poder diseñar primero el encabezado, los nombres de las ramas y las etiquetas, necesitamos la opción de color "automático" en nuestro comando git como en EDIT 3.
Luego podemos reemplazar los valores de color conocidos con los nuestros agregando estas 3 líneas
# 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}
en nuestro fragmento de código. Los valores de reemplazo producen los colores anteriores.
Por ejemplo, el valor de reemplazo para la cabeza es
3;5;1;38;5;196
donde 3; significa cursiva, 5; para parpadear y 1; 38; 5; 196 para el color. Para más información comienza aquí. Nota: Este comportamiento depende de su terminal favorito y, por lo tanto, puede no ser utilizable.
PERO puedes elegir el valor de color que prefieras.
DESCRIPCIÓN GENERAL de los valores de color git y equivalentes ANSI
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" ###
}
y llame a la función git_tably (derivada de tablelike) directamente debajo de su ruta de proyecto git o desde donde desee con su ruta de proyecto git como primer parámetro.
2) como un script de shell :
Lo uso con la opción de pasar un directorio de proyecto git como primer parámetro o, si está vacío, tomar el directorio de trabajo como el comportamiento normal. En su totalidad tenemos
# 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) como un alias git :
Quizás la forma más cómoda es agregar un alias git en su .gitconfig
EDITAR 6 :
Debido a sus votos positivos, mejoré el fragmento. Ahora puede alimentarlo con casi cualquier comando git log y ya no tiene que adaptar el código. ¡Intentalo!
¿Cómo funciona?
defina sus comandos de registro git en su .gitconfig como siempre
definir un número de columna de árbol positivo (opcional), donde se muestra el gráfico git
Entonces solo llama
git tably YourLogAlias
o
git tably YourLogAlias TreeColNumber
donde TreeColNumber sobrescribe un valor siempre definido desde arriba.
Limitación
para cada especificador en su comando de registro debe usar esta sintaxis
%><(<N>[,ltrunc|mtrunc|trunc])
además del último y solo si la columna de árbol elegida no debería ser la última
Debería explicar en su respuesta cómo estos fragmentos de bash se convertirán en elegantes comandos tipo git log. Uno puede descubrir los usos mirando la respuesta que vinculó, pero las respuestas deben ser independientes
Andras Deak
¿Quiere decir que debería explicar el cmd de git log en detalle? O podrías darme un ejemplo de lo que te estás perdiendo, por favor.
onemorequestion
Nota: este fragmento utiliza la salida del impresionante comando git log para recibir la salida en forma de tabla en un terminal. Entonces, al revés como mencionaste;)
onemorequestion
Me imaginé que no estás escribiendo 20 líneas de bash cada vez que necesitas esto. Tiene sentido definir esto como una función bash o un alias git. La mayoría de los lectores no se molestarán en intentar completar su código para que sea fácil de usar. A eso me refería. Si solo coloca el código en un archivo sh aleatorio en su ruta, puede ignorarme.
Andras Deak
1
Veo. Gracias por su consejo. Editaré mi respuesta y agregaré dicho alias. Normalmente uso archivos para comandos "largos" como usted mencionó. Pero tener ambas formas escritas aquí es mucho más cómodo, estoy de acuerdo.
onemorequestion
5
algunos alias en ~ / .oh-my-zsh / plugins / git / git.plugin.zsh
Para los usuarios de OSX, tomé el ejemplo de @gospes y lo modifiqué ligeramente para gsed ( gnu-sedinstalado a través de homebrew) y ajusté los colores (para trabajar con un fondo negro, no estoy seguro de cómo el ejemplo original podría representarse de la manera que lo hace en el ejemplo, ya que especifica texto negro en un terminal con un fondo negro).
La clave para OSX es instalar primero gnu sed (que tiene la opción -r). Se hace más fácilmente con homebrew, que no sobrescribirá el sed instalado en el sistema, sino que instalará gnu sed como "gsed". Espero que esto ayude a @ SlippD.Thompson, quien comentó anteriormente sobre OSX no funciona.
Respuestas:
Actualización: esta respuesta ha recibido mucha más atención de la que merece. Originalmente se publicó porque creo que los gráficos se ven bien y podrían dibujarse en Illustrator para una publicación, y no había una mejor solución. ¡Pero ahora existen respuestas mucho más aplicables a esta Q, como las de Frazz , Jubobs o Harry Lee ! ¡Por favor, vota a esos!
Actualización 2: publiqué una versión mejorada de esta respuesta a la topología de rama Visualizing en la pregunta git , ya que es mucho más apropiado allí. Esa versión incluye
lg3
, que muestra tanto la información del autor como la del confirmador, por lo que realmente debería consultarla. Dejando esta respuesta por razones históricas (y rep, lo admito), aunque estoy realmente tentado de eliminarla.Mis 2 ¢ : Tengo dos alias que normalmente incluyo en mi
~/.gitconfig
archivo:git lg
/ segit lg1
ve así:y se
git lg2
ve así:fuente
#202020
/#555555
, rojo:#5d1a14
/#da4939
, verde:#424e24
/#a5c261
, amarillo:#6f5028
/#ffc66d
, azul:#263e4e
/#6d9cbe
, magenta:#3e1f50
/#a256c7
, cian:#234e3f
/#62c1a1
y blanco:#979797
/#ffffff
.--date=relative
y--abbrev-commit
son redundantes porque utilizas explícitamente%cr
y%h
, respectivamente.%C(auto)
Agregaría el modificador a los nombres de referencia (%d
) para obtener colores más agradables. Ver 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
Muchas de las respuestas aquí son geniales, pero para aquellos que solo quieren una respuesta simple de una línea al punto sin tener que configurar alias ni nada extra, aquí está:
No todos lo harían
git log
todo el tiempo, pero cuando lo necesites solo recuerda:fuente
git config --global alias.adog "log --all --decorate --oneline --graph"
--all
tanto tiempo que estoy a punto de llorar (T_T) ¡GRACIAS!Para la salida de texto puedes probar:
o:
o: aquí hay un alias graphviz para dibujar el gráfico DAG.
Yo personalmente uso
gitx
,gitk --all
ygitnub
.fuente
--abbrev-commit --decorate
, ¡y luego es perfecto!--abbrev-commit
si lo usas--oneline
git log --graph --oneline --decorate --date=relative --all
el--date
argumento es inútil. No puedo ver ninguna fecha mostrada en el registro.Gitgraph.js permite dibujar bonitas ramas git sin un repositorio. Simplemente escriba un código Javascript que configure sus ramas y confirmaciones y renderícelo en el navegador.
o con
metro
plantilla:o con mensajes de confirmación, autores y etiquetas:
Pruébelo con JSFiddle .
Generarlo con Git Grapher por @bsara.
fuente
Construido sobre TikZ y PGF ,
gitdags
es un pequeño paquete de LaTeX que le permite producir sin esfuerzo gráficos de confirmación de gráficos vectoriales, y más.La generación automática del gráfico de confirmación de un repositorio existente no es el propósito de
gitdags
; los gráficos que produce son solo para fines educativos .A menudo lo uso para producir gráficos para mis respuestas a las preguntas de Git, como alternativa a los gráficos de compromiso ASCII:
Aquí hay un ejemplo de dicho gráfico que demuestra los efectos de un simple rebase:
fuente
:)
latex input.tex
para generar un dvi, y finalmente usardvisvgm input.dvi
para generar un SVG con transparencia. Convertir desde el SVG a un formato ráster como PNG es bastante fácil conconvert -antialias -density 300 -background none input.svg output.png
. Por cierto, estas imágenes se ven increíbles con total transparencia. Todavía estoygitdags
está en camino!Gitg es un clon de Gitk y GitX para GNOME (también funciona en KDE, etc.) que muestra un gráfico bastante coloreado.
Se desarrolla activamente (a partir de 2012). Le permite ordenar las confirmaciones (nodos de gráficos) cronológica o topológicamente , y ocultar las confirmaciones que no conducen a una rama seleccionada.
Funciona bien con repositorios grandes y gráficos de dependencia complejos.
Capturas de pantalla de muestra, que muestran los repositorios linux-git y linux-2.6:
fuente
Acabo de escribir una herramienta que puede generar un bonito gráfico de git commits usando HTML / Canvas.
Y proporcione un complemento jQuery que lo haga fácil de usar.
[github] https://github.com/tclh123/commits-graph
Avance:
fuente
Sourcetree es realmente bueno. Imprime un historial atractivo y de tamaño mediano y un gráfico de rama: (lo siguiente se hace en un proyecto experimental de Git solo para ver algunas ramas). Admite Windows 7+ y Mac OS X 10.6+.
fuente
git-forest
es un excelente script perl que he estado usando durante más de un año y ya casi no uso elgit log
comando directamente.Estas son algunas de las cosas que me encantan de este script:
--reverse
con la salida del gráfico, que no es posible con elgit log
comando regular .git log
internamente para obtener la lista de confirmaciones, por lo que todas las opciones que pasagit log
también se pueden pasar a este script.Tengo un alias usando
git-forest
lo siguiente:Así es como se ve la salida en un terminal:
fuente
Escribí una herramienta web para convertir registros de git en bonitos gráficos SVG: Bit-Booster - Herramienta de dibujo de gráficos de confirmación fuera de línea
Subir salida de
git log --pretty='%h|%p|%d'
directamente en la herramienta y luego haga clic en el enlace "descargar graph.svg".La herramienta es del lado del cliente puro, por lo que ninguno de sus datos de Git se comparte con mi servidor. También puede guardar el HTML + JS localmente y ejecutarlo usando URL "file: ///". Verificado en Chrome 48 y Firefox 43 en Ubuntu 12.04.
Genera HTML que se puede publicar directamente en cualquier página (¡incluido el motor de blogs blogspot!). Echa un vistazo a algunas de las publicaciones del blog aquí:
http://bit-booster.blogspot.ca/
Aquí hay una captura de pantalla de un archivo HTML de muestra generado por la herramienta:
http://bit-booster.com/graph.html (la herramienta)
fuente
Basado en un script Graphviz que encontré en una respuesta a una pregunta relacionada , he pirateado un script ruby que crea una vista de resumen de un repositorio git. Elimina toda la historia lineal y solo muestra confirmaciones "interesantes", es decir, aquellas con múltiples padres, múltiples hijos o señaladas por una rama o etiqueta. Aquí hay un fragmento del gráfico que genera para jquery :
git-big-picture y BranchMaster son herramientas similares que intentan mostrar solo la estructura de alto nivel de un gráfico, al mostrar solo cómo se relacionan las etiquetas, ramas, fusiones, etc.
Esta pregunta tiene algunas opciones más.
fuente
He añadido tres comandos personalizados:
git tree
,git stree
ygit vtree
. Los revisaré en ese orden.Con
git stree
ygit vtree
he usado bash para ayudar con el formateo.EDITAR: Esto funciona con git versión 1.9a. El valor de color 'auto' aparentemente está haciendo su debut en este lanzamiento. Es una buena adición porque los nombres de las ramas tendrán un color diferente. Esto facilita la distinción entre ramas locales y remotas, por ejemplo.
fuente
fatal: bad color value 'auto' for variable '--pretty format'
:(sed: illegal option -- r
Depende de cómo se veían. Yo uso gitx que hace fotos como esta:
Puede comparar
git log --graph
vs gitk en una combinación de pulpo de 24 vías (originalmente de http://clojure-log.n01se.net/date/2008-12-24.html ):fuente
Para una salida textual más detallada, intente:
Puede escribir un alias en $ HOME / .gitconfig
fuente
Esta es mi opinión sobre este asunto:
Captura de pantalla:
Uso:
git hist
- Mostrar el historial de la sucursal actualgit hist --all
- Mostrar el gráfico de todas las ramas (incluidos los controles remotos)git hist master devel
- Mostrar la relación entre dos o más ramasgit hist --branches
- Mostrar todas las sucursales localesAgregar
--topo-order
para ordenar confirmaciones topológicamente, en lugar de por fecha (predeterminado en este alias)Beneficios:
--decorate
, por lo que con colores separados para diferentes nombres de ramasPreparar:
fuente
gitg : un visor de repositorio basado en gtk, eso es nuevo pero interesante y útil
http://git.gnome.org/browse/gitg
Lo uso actualmente
fuente
GitX
y bastante bueno en eso. RecomiendaAunque a veces uso gitg , siempre vuelvo a la línea de comando:
Como puede ver, es casi un alias para guardar pulsaciones de teclas, basado en:
Consulte en la versión reciente de git (1.8.5 y superior) que puede beneficiarse de% C (automático) en el marcador de posición de decoración% d
Desde aquí, todo lo que necesita es una buena comprensión de gitrevisions para filtrar lo que necesite (algo así como master..develop, donde --simplify-merges podría ayudar con ramas a largo plazo)
El poder detrás de la línea de comando es la configuración rápida basada en sus necesidades (comprenda que un repositorio no es una configuración de registro de clave única, por lo que a veces es necesario agregar --numstat, o --raw, o --name-status. Aquí git log y los alias son rápidos, potentes y (con el tiempo) el gráfico más bonito que puede lograr. Aún más, con la salida mostrada por defecto a través de un localizador (digamos menos) siempre puede buscar rápidamente dentro de los resultados. ¿No está convencido? Siempre puede analizar el resultado con proyectos como gitgraph
fuente
Muy ligeramente ajustando la increíble respuesta de Slipp , puedes usar sus alias para registrar solo una rama:
Al dejar de lado
--all
, ahora puedes hacero incluso
fuente
Sugiero
tig
https://github.com/jonas/tig , una herramienta de línea de comando mucho mejor para git.Puede usar homebrew para instalar tig en macOS:
fuente
Tengo este
git log
alias~/.gitconfig
para ver el historial del gráfico:Con esto en su lugar,
git l
generará algo como:En Git 2.12 + puedes incluso personalizar los colores de línea del gráfico usando la
log.graphColors
opción de configuración.En cuanto al formato de los registros, es similar a
--oneline
, con la adición del nombre del autor (respetando.mailmap
) y la fecha relativa del autor . Tenga en cuenta que la%C(auto)
sintaxis, que le dice a Git que use los colores predeterminados para commit hash, etc., es compatible con Git> = 1.8.3 .fuente
git log --graph --oneline
solo para asegurarse de que oneliner no se pierda¿Intentaste
gitk
ogitk --all
? Sin embargo, no tiene una función imprimir / guardar img como función.fuente
--all
te muestra todas las ramas.GitGraph
Genera una representación PNG o SVG del historial de confirmación de su repositorio Git.
https://code.google.com/p/gitgraph
fuente
Esta es mi variación terminal, similar a muchas respuestas aquí. Me gusta ajustar las banderas que se pasan
less
para evitar el ajuste de palabras.Establecí esto en un alias para acceso rápido ya que el comando es un poco engorroso.
fuente
Prueba ditaa . Puede transformar cualquier diagrama ASCII en una imagen. Aunque no se diseñó teniendo en cuenta las ramas de Git, los resultados me impresionaron.
Fuente (archivo txt):
Mando:
Resultado:
También admite colores de fondo, líneas discontinuas, diferentes formas y más. Ver los ejemplos .
fuente
Si su repositorio se encuentra en Gitlab, puede usar su representación gráfica, ya que se representa como SVG en su navegador.
Vaya a la vista gráfica de su repositorio, por ejemplo, https://gitlab.com/gitlab-org/gitter/webapp/network/develop
Desplácese hacia abajo hasta el gráfico (¡vagas cargas confirmadas!)
Use el inspector de su navegador para copiar el elemento SVG a un nuevo archivo
Ábralo en un procesador de su elección, por ejemplo, Inkscape
fuente
No conozco una herramienta directa, pero tal vez puedas hackear un script para exportar los datos en formato de puntos y renderizarlos con graphviz.
fuente
io
comandos a simples comandos perl `git log [...]` funcionó para mí.brew install perl dot
y luegocpan common::sense IO::all
obtener las dependencias. Luego, simplemente canalice la salida a un comando apropiado, comogit-graphviz | dot -Tpng -o repo.png
. Sin embargo, el resultado no es muy diferente al de git-big-picture .Hay un gráfico de compromiso Git funky como una de las demos de la biblioteca de gráficos web Raphael .
La demostración es estática, pero debería ser bastante fácil tomar el código e intercambiar sus datos estáticos por un conjunto de datos en vivo; creo que son solo datos de confirmación de Git en formato JSON.
La demostración está aquí: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
fuente
Una salida de gráfico git similar a una tabla agradable y limpia para conchas
con hashes habitualmente además del árbol de gráficos
o en una columna extra
Editar : ¿Quieres comenzar de inmediato sin leer las explicaciones? Use fragmentos de código de alias, script o funciones de git de la sección EDIT 5 a continuación o incluso la forma más cómoda con EDIT 6 .
Hasta ahora, en todas las respuestas a esta pregunta, ninguna mostró un resultado de aspecto de tabla limpio para los depósitos. Lo más cercano fue esta respuesta de los evangelios desde donde comencé.
El punto central de mi enfoque es contar solo los caracteres del árbol que se muestran al usuario. Luego, llénelos a una longitud personal con espacios en blanco.
Aparte de git, necesitas estas herramientas
principalmente a bordo con cualquier distribución de Linux.
El fragmento de código es
Para calcular los espacios en blanco necesarios usamos
para obtener todos los caracteres (hasta 1000 por línea) que seleccione solo los caracteres del árbol: * | / \ _ y espacios en blanco con
finalmente contarlos y restar el resultado de nuestro valor de longitud elegido, que es 9 en el ejemplo.
Para producir la cantidad calculada de espacios en blanco utilizamos
y truncar los números de posición con
que agregarlos al final de nuestra línea gráfica. ¡Eso es!
Git tiene la buena opción de formatear la longitud de los especificadores de salida ya con la sintaxis
'%><(amount_of_characters,truncate_option)'
, que agrega espacios en blanco desde el lado izquierdo '>' o derecho '<' y puede truncar caracteres desde el inicio 'ltrunc', 'mtrunc' medio o final 'trunc'.Es importante que los cmd de printf anteriores usen los mismos valores de longitud para la columna git correspondiente.
Diviértete para diseñar tu propia salida de aspecto limpio a tus necesidades.
Extra:
Para obtener el valor de longitud correcto, puede usar el siguiente fragmento
y use $ max_chars como el valor de longitud correcto arriba.
EDITAR 1 : Acabo de notar que el carácter subrayado también se usa en el árbol git y edita los fragmentos de código anteriores en consecuencia. Si faltan otros caracteres, deje un comentario.
EDIT 2 : si desea deshacerse de los corchetes alrededor de las entradas de rama y etiqueta, simplemente use "% D" en lugar de "% d" en el comando git, como en EDIT 3.
EDITAR 3 : ¿Quizás la opción de color "automático" es la que más prefiere para las entradas de rama y etiqueta?
Cambiar esta parte del comando git (color 214 )
a auto
EDIT 4 : ¿O te gusta tu propia mezcla de colores para esa parte, una salida elegante con cabeza parpadeante?
Para poder diseñar primero el encabezado, los nombres de las ramas y las etiquetas, necesitamos la opción de color "automático" en nuestro comando git como en EDIT 3.
Luego podemos reemplazar los valores de color conocidos con los nuestros agregando estas 3 líneas
justo antes de la línea
en nuestro fragmento de código. Los valores de reemplazo producen los colores anteriores.
Por ejemplo, el valor de reemplazo para la cabeza es
donde 3; significa cursiva, 5; para parpadear y 1; 38; 5; 196 para el color. Para más información comienza aquí. Nota: Este comportamiento depende de su terminal favorito y, por lo tanto, puede no ser utilizable.
PERO puedes elegir el valor de color que prefieras.
DESCRIPCIÓN GENERAL de los valores de color git y equivalentes ANSI
Aquí encontrará una lista con la opción de color / estilo git .
Si necesita la salida en su consola para obtener colores precisos (la imagen de arriba se reduce mediante stackoverflow) puede producir la salida con
en su ruta de proyecto git que usa el primer commit de su salida de registro git.
EDITAR 5 : Como mencionó el miembro "Andras Deak", hay algunas formas de usar este código:
1) como un alias :
alias no acepta parámetros, pero una función puede , por lo tanto, solo defina en su .bashrc
y llame a la función git_tably (derivada de tablelike) directamente debajo de su ruta de proyecto git o desde donde desee con su ruta de proyecto git como primer parámetro.
2) como un script de shell :
Lo uso con la opción de pasar un directorio de proyecto git como primer parámetro o, si está vacío, tomar el directorio de trabajo como el comportamiento normal. En su totalidad tenemos
3) como un alias git :
Quizás la forma más cómoda es agregar un alias git en su .gitconfig
Que simplemente llamar
git tably
bajo cualquier ruta de proyecto.Git es tan poderoso que puede cambiar la cabeza, las etiquetas, ... directamente como se muestra arriba y tomada desde aquí .
Otra opción elegante es seleccionar los colores de árbol que más prefieras con
eso te da una apariencia loca pero siempre salidas de registro git como una tabla
Demasiado parpadeo! Solo para demostrar lo que es posible. Muy pocos colores especificados conducen a repeticiones de color.
Una referencia completa de .gitconfig está a solo un clic de distancia.
EDITAR 6 : Debido a sus votos positivos, mejoré el fragmento. Ahora puede alimentarlo con casi cualquier comando git log y ya no tiene que adaptar el código. ¡Intentalo!
¿Cómo funciona?
Entonces solo llama
git tably YourLogAlias
o
git tably YourLogAlias TreeColNumber
donde TreeColNumber sobrescribe un valor siempre definido desde arriba.
Limitación
para cada especificador en su comando de registro debe usar esta sintaxis
%><(<N>[,ltrunc|mtrunc|trunc])
además del último y solo si la columna de árbol elegida no debería ser la última
(para explicaciones, consulte https://git-scm.com/docs/pretty-formats )
YourLogAlias-col
Ahora el fragmento mejorado para su .gitconfig
Resultados:
o con el nuevo TreeColNumber sobre la marcha
OTRA VEZ: diviértete para diseñar tu propia salida de aspecto limpio a tus necesidades.
fuente
algunos alias en ~ / .oh-my-zsh / plugins / git / git.plugin.zsh
fuente
Para los usuarios de OSX, tomé el ejemplo de @gospes y lo modifiqué ligeramente para gsed (
gnu-sed
instalado a través de homebrew) y ajusté los colores (para trabajar con un fondo negro, no estoy seguro de cómo el ejemplo original podría representarse de la manera que lo hace en el ejemplo, ya que especifica texto negro en un terminal con un fondo negro).La clave para OSX es instalar primero gnu sed (que tiene la opción -r). Se hace más fácilmente con homebrew, que no sobrescribirá el sed instalado en el sistema, sino que instalará gnu sed como "gsed". Espero que esto ayude a @ SlippD.Thompson, quien comentó anteriormente sobre OSX no funciona.
fuente