Jolis graphiques de twig

J’ai vu des livres et des articles avoir des graphiques très jolis de twigs et de commits git. Comment puis-je créer des images imprimables de haute qualité de l’historique de git?

Mise à jour: Cette réponse a reçu beaucoup plus d’attention qu’elle ne le mérite. Il a été initialement publié parce que je pense que les graphiques sont beaux et qu’ils pourraient être extraits dans Illustrator pour une publication – et il n’y avait pas de meilleure solution. Mais il existe maintenant des réponses beaucoup plus applicables à ce Q, telles que fracz , Jubobs ou Harry Lee ! S’il vous plaît aller à la hausse de ceux-ci!

Mise à jour 2: J’ai publié une version améliorée de cette réponse à la topologie de twig Visualizing dans la question git , car elle y est beaucoup plus appropriée. Cette version inclut lg3 , qui affiche à la fois les informations sur l’auteur et le committer, de sorte que vous devriez vraiment le vérifier. Laissant cette réponse pour des raisons historiques (& rep, je vais admettre), je suis vraiment tenté de le supprimer.

2 ¢ : J’ai deux alias que je lance normalement dans mon fichier ~/.gitconfig :

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

git lg / git lg1 ressemble à ceci:
git lg1

et git lg2 ressemble à ceci:
git lg2

La plupart des réponses sont géniales, mais pour ceux qui veulent simplement répondre à une simple question sans avoir à configurer des alias ou quelque chose en plus, la voici:

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

Tout le monde ne ferait pas tout le temps un journal de bord, mais quand vous en avez besoin, rappelez-vous simplement: ” Un chien ” = git log – un – ecorate – o neline – g raph

entrer la description de l'image ici

Pour une sortie textuelle, vous pouvez essayer:

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

ou:

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

ou: voici un alias graphviz pour dessiner le graphe DAG.

J’utilise personnellement gitx , gitk --all et gitnub .

Gitgraph.js permet de dessiner de jolies twigs sans un repository. Il suffit d’écrire un code Javascript qui configure vos twigs et vos commits et les rend dans le navigateur.

 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); 

exemple de graphique généré avec Gitgraph.js

ou avec modèle de metro :

Thème du métro GitGraph.js

ou avec des messages de validation, des auteurs et des balises:

GitGraph avec des messages de validation

Testez-le avec JSFiddle .

Générez-le avec Git Grapher par @bsara.

gitdags sur TikZ & PGF , gitdags est un petit package LaTeX qui vous permet de créer sans effort des graphes de validation pour les graphiques vectoriels, etc.

La génération automatique du graphe de validation d’un référentiel existant n’est pas le but de gitdags ; les graphiques produits ne sont destinés qu’à des fins éducatives .

Je l’utilise souvent pour produire des graphiques pour mes réponses aux questions de Git, en alternative aux graphes de validation ASCII:

  • Comment puis-je corriger un bug sur master et l’intégrer dans ma ou mes twigs moins stables?
  • Comment git valide-t-il exactement le travail?
  • Pourquoi Git me dit “Pas actuellement sur n’importe quelle twig” après avoir exécuté “git checkout origin / “?
  • Quelle est la différence entre la fusion de master en twig et la fusion de twig en master?
  • Git rebase –preserve-merges échoue

Voici un exemple d’un tel graphique démontrant les effets d’une rebase simple:

entrer la description de l'image ici

 \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} 

Gitg est un clone de Gitk et GitX pour GNOME (il fonctionne aussi sur KDE etc.) qui montre un joli graphique coloré.

Il est activement développé (à partir de 2012). Il vous permet de sortinger les commits (nœuds de graphe) de manière chronologique ou topologique et de masquer les commits qui ne conduisent pas à une twig sélectionnée.

Cela fonctionne bien avec de grands référentiels et des graphes de dépendance complexes.

Exemples de captures d’écran montrant les référentiels linux-git et linux-2.6:

linux-git

linux-2.6

SourceTree est un très bon. Il imprime un historique et un graphe de twig de bonne taille et de taille moyenne: (ce qui suit est réalisé sur un projet expérimental de Git juste pour voir certaines twigs). Prend en charge Windows 7+ et Mac OS X 10.6+.

entrer la description de l'image ici

http://www.sourcetreeapp.com/

Je viens d’écrire un outil qui peut générer des graphes de validation assez git en utilisant HTML / Canvas.

Et fournissez un plugin jQuery qui le rend facile à utiliser.

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

Aperçu:

Aperçu

git-forest est un excellent script perl que j’utilise depuis plus d’un an et j’utilise à peine la commande git log .

Voici quelques-unes des choses que j’aime dans ce script:

  • Il utilise des caractères Unicode pour tracer les lignes du graphique, donnant ainsi un aspect plus continu aux lignes du graphique.
  • Vous pouvez combiner – --reverse avec la sortie graphique, ce qui n’est pas possible avec la commande régulière git log .
  • Il utilise git log interne pour récupérer la liste des validations, ainsi toutes les options que vous transmettez à git log peuvent également être transmises à ce script.

J’ai un alias utilisant git-forest comme suit:

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

Voici à quoi ressemble la sortie sur un terminal:

entrer la description de l'image ici

Basé sur un script Graphviz que j’ai trouvé dans une réponse à une question connexe , j’ai piraté un script Ruby qui crée une vue récapitulative d’un référentiel git. Il élimine toute l’histoire linéaire et montre simplement des commits “intéressants”, c’est-à-dire ceux avec plusieurs parents, plusieurs enfants, ou pointés par une twig ou une étiquette. Voici un extrait du graphique qu’il génère pour jquery :

échantillon jquery

git-big-picture et BranchMaster sont des outils similaires qui essaient d’afficher uniquement la structure de haut niveau d’un graphique, en affichant uniquement le lien entre les balises, les twigs, les fusions, etc.

Cette question a plus d’options.

Dépend de ce à quoi ils ressemblaient. J’utilise gitx qui fait des images comme celle-ci:

parcelle simple

Vous pouvez comparer git log --graph vs gitk sur une fusion de pieuvres à 24 voies (à partir de http://clojure-log.n01se.net/date/2008-12-24.html ):

Octopus Git 24 voies fusionnent. L’URL originale était <code/> http://lwn.net/images/ns/kernel/gitk-octopus.png </ code>“></p>
</div>
</li><!-- #comment-## -->
<div class=

J’ai écrit un outil web pour convertir les logs de git en jolis graphes SVG: Bit-Booster – Outil de dessin graphique hors ligne Commit

Téléchargez la sortie de git log --pretty='%h|%p|%d' directement dans l’outil, puis cliquez sur le lien “download graph.svg”.

L’outil est côté client pur et aucune de vos données Git n’est donc partagée avec mon serveur. Vous pouvez également enregistrer le HTML + JS localement et l’exécuter en utilisant l’URL “file: ///”. Vérifié sur Chrome 48 et Firefox 43 sur Ubuntu 12.04.

Il génère du HTML qui peut être posté directement dans n’importe quelle page (y compris le moteur de blog de blogspot!). Jetez un coup d’œil à certains articles du blog ici:

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

Voici une capture d’écran d’un exemple de fichier HTML généré par l’outil:

http://bit-booster.com/graph.html (l’outil)

J’ai ajouté trois commandes personnalisées: git tree , git stree et git vtree . Je les passerai dans cet ordre.

 [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)' 

entrer la description de l'image ici

Avec git stree et git vtree j’utilise bash pour aider au formatage.

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

git_stree


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

git_vtree


EDIT: Cela fonctionne avec la version 1.9a de git. La valeur de couleur «auto» fait apparemment son entrée dans cette version. C'est un ajout intéressant car les noms des twigs auront une couleur différente. Cela facilite la distinction entre les succursales locales et distantes, par exemple.

Pour des informations textuelles plus détaillées, veuillez essayer:

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

Vous pouvez écrire un alias dans $ HOME / .gitconfig

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

gitg : un visualiseur de référentiel basé sur GTK , nouveau mais intéressant et utile
http://git.gnome.org/browse/gitg
Je l’utilise actuellement

Bien que parfois j’utilise gitg , reviens toujours en ligne de commande:

 [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 

Comme vous pouvez le constater, presque une frappe de touche permet de sauvegarder les alias, en fonction de:

  • --couleur: look clair
  • --graph: visualiser les parents
  • --date-order: regard le plus compréhensible sur repo
  • --décorer: qui est qui
  • --oneline: plusieurs fois tout ce que vous devez savoir sur un commit
  • --simplify-by-decoration: basique pour un premier regard (juste des tags, des fusions pertinentes, des twigs)
  • --all: enregistrer des frappes avec tous les alias avec et sans cette option
  • --date = relative (% ar): Comprendre l'activité en repo (parfois une twig est peu engagée près du maître mais il y a des mois de sa part)

Voir dans la version récente de git (1.8.5 et supérieur), vous pouvez bénéficier de% C (auto) dans l'espace réservé% d

À partir de là, tout ce dont vous avez besoin est une bonne compréhension de gitrevisions pour filtrer tout ce dont vous avez besoin (quelque chose comme master..develop, où --simplify-merges pourrait aider avec les twigs à long terme)

Le pouvoir derrière la ligne de commande est la configuration rapide basée sur vos besoins (comprendre un repo n'est pas une configuration de journal de clés unique, donc il est parfois nécessaire d'append --numstat ou --raw ou --name-status. et les alias sont rapides, puissants et (avec le temps) le plus joli graphique que vous pouvez obtenir. De plus, avec la sortie affichée par défaut via un pager (disons moins), vous pouvez toujours rechercher rapidement les résultats. avec des projets comme gitgraph

C’est mon sharepoint vue à ce sujet:

Capture d’écran:

Capture d'écran

Usage:

git hist – Affiche l’historique de la twig actuelle

git hist --all – Affiche le graphique de toutes les twigs (y compris les télécommandes)

git hist master devel – Montre la relation entre deux ou plusieurs twigs

git hist --twigs – Affiche toutes les twigs locales

Ajouter --topo-order pour sortinger les commits topologiquement, au lieu de par date (par défaut dans cet alias)

Avantages:

  • Ressemble à un simple – --decorate , donc avec des couleurs séparées pour les différents noms de twig
  • Ajoute un email committer
  • Ajoute la date relative et absolue de la validation
  • Sorts commet par date

Installer:

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

J’ai cet alias de git log dans ~/.gitconfig pour voir l’historique du graphique:

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

Avec ceci en place, git l produira quelque chose comme:

entrer la description de l'image ici

Dans Git 2.12 +, vous pouvez même personnaliser les couleurs de trait du graphique à l’aide de l’option de configuration log.graphColors .

En ce qui concerne le format des journaux, il est similaire à --oneline , avec l’ajout du nom de l’ auteur (en respectant .mailmap ) et de la date relative de l’auteur . Notez que la syntaxe %C(auto) , qui indique à Git d’utiliser les couleurs par défaut pour le hachage de validation, est prise en charge dans Git> = 1.8.3 .

GitGraph

Génère une représentation PNG ou SVG de l’historique de validation de votre repository Git.

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

Très légèrement peaufiner la réponse géniale de Slipp , vous pouvez utiliser ses alias pour enregistrer une seule twig:

 [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" 

En laissant de côté – tout ce que vous pouvez faire maintenant

 git lgBranch1  

ou même

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

Ceci est ma variante terminale, semblable à beaucoup de réponses ici. J’aime ajuster les indicateurs transmis à less pour empêcher le retour à la ligne.

exemple de sortie

Je mets ceci en alias pour un access rapide car la commande est un peu lourde.

Avez-vous essayé gitk ou gitk --all ? Cependant, il n’a pas de fonction print / save img.

Je suggère tig https://github.com/jonas/tig , un outil de ligne de commande beaucoup mieux pour git.

Vous pouvez utiliser homebrew pour installer tig sur macOS:

 $ brew install tig $ tig 

entrer la description de l'image ici

Essayez le ditaa . Il peut transformer n’importe quel diagramme ASCII en une image. Bien que ce modèle n’ait pas été conçu pour les twigs de Git, j’ai été impressionné par les résultats.

Source (fichier txt):

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

Commander:

 java -jar ditaa0_9.jar ascii-graph.txt 

Résultat:

entrer la description de l'image ici

Il prend également en charge les couleurs d'arrière-plan, les lignes en pointillés, les différentes formes et bien plus encore. Voir les exemples .

Il existe un graphe de commits funky Git parmi les démos de la bibliothèque graphique Web de Raphael .

La démo est statique, mais il devrait être assez facile de prendre le code et d’échanger ses données statiques pour un dataset en direct – je pense que ce ne sont que des données de validation Git au format JSON.

La démo est ici: http://dmitrybaranovskiy.github.io/raphael/github/impact.html

Je ne sais pas pour un outil direct, mais peut-être que vous pouvez pirater un script pour exporter les données au format point et le rendre avec graphviz.

Pour les utilisateurs d’OSX, j’ai pris l’exemple de @gospes et l’ai légèrement modifié pour gsed (installé par homebrew) et ajusté les couleurs (pour travailler avec un arrière-plan noir, pas sûr de savoir comment l’exemple original pourrait fait dans l’exemple car il spécifie du texte noir sur un terminal avec un arrière-plan noir).

 [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 clé pour OSX est d'installer d'abord GNUED (qui a l'option -r). Le plus facilement fait avec homebrew, qui ne remplacera pas le sed installé par le système, mais installera plutôt gnu sed comme "gsed". J'espère que cela aidera @ SlippD.Thompson qui a commenté ci-dessus à propos d'OSX ne fonctionne pas.

En regardant cette conversation, j’ai essayé d’utiliser mon préféré git-cola & git-dag . Running View->DAG... from git-cola and replace Log: master -- with --all shows pretty graph with all twigs.

some aliases 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' 

In addition to the answer of ‘Slipp D. Thompson’, I propose you to add this alias to have the same decoration but in a single line by commit :

 git config --global alias.tre "log --graph --decorate --pretty=oneline --abbrev-commit --all --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)'"