├── .gitignore ├── files └── .gitignore ├── examples ├── .gitignore ├── Makefile ├── 1.1.1.tex ├── 1.4.1.tex ├── 1.1.2.tex ├── 1.5.2.tex ├── subcaption.tex └── experiment.tex ├── run.sh ├── HELP.txt ├── convert_files.sh ├── README.md └── Dockerfile /.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /files/.gitignore: -------------------------------------------------------------------------------- 1 | *png 2 | *tex 3 | *aux 4 | *log 5 | *pdf 6 | -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | *pdf 2 | *log 3 | *aux 4 | *png 5 | *out 6 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run --rm --name=gitdag -v $(pwd):/files -ti imiell/gitdags /convert_files.sh 3 | -------------------------------------------------------------------------------- /HELP.txt: -------------------------------------------------------------------------------- 1 | imiell/gitdags help 2 | =================== 3 | 4 | host $ docker run --rm --name=gitdag -v $(pwd):/files -ti imiell/gitdags /convert_files.sh 5 | docker $ ls files 6 | 7 | '*.tex' files are read from, and placed in your local folder as .png's. 8 | 9 | -------------------------------------------------------------------------------- /examples/Makefile: -------------------------------------------------------------------------------- 1 | TEX_FILES:=$(wildcard *.tex) 2 | OBJ_FILES:=$(patsubst %.tex,%.tex.png,$(TEX_FILES)) 3 | 4 | %.tex.png: %.tex 5 | pdflatex --jobname $< $< 6 | convert -density 600x600 $<.pdf -quality 90 -resize 1080x800 $<.png 7 | 8 | all: $(OBJ_FILES) 9 | 10 | clean: 11 | rm -f *pdf *log *aux *tex.png *out 12 | -------------------------------------------------------------------------------- /convert_files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eux 4 | 5 | cd /files 6 | if [ -a Makefile ] 7 | then 8 | make 9 | else 10 | for f in $(ls *tex) 11 | do 12 | pdflatex ${f} 13 | basef=$(echo $f | sed 's/.tex//g') 14 | convert -density 600x600 ${basef}.pdf -quality 90 -resize 1080x800 ${basef}.png 15 | done 16 | fi 17 | -------------------------------------------------------------------------------- /examples/1.1.1.tex: -------------------------------------------------------------------------------- 1 | % graph LR 2 | % A --> B 3 | % B --> C 4 | \documentclass[preview]{standalone} 5 | 6 | \usepackage{subcaption} 7 | \usepackage{gitdags} 8 | 9 | \begin{document} 10 | 11 | \begin{figure} 12 | \begin{subfigure}[b]{\textwidth} 13 | \centering 14 | \begin{tikzpicture} 15 | % Commit DAG 16 | \gitDAG[grow right sep = 2em]{ 17 | A -- B -- C 18 | }; 19 | \end{tikzpicture} 20 | \end{subfigure} 21 | \end{figure} 22 | 23 | \end{document} 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gitdags 2 | 3 | Based on: 4 | 5 | http://chrisfreeman.github.io/gitdags_install.html 6 | 7 | and 8 | 9 | https://github.com/Jubobs/gitdags 10 | 11 | See also: 12 | 13 | https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs 14 | 15 | ![example](https://i.stack.imgur.com/Tg7Kn.png) 16 | 17 | ## Docker Image 18 | 19 | ``` 20 | host $ cd examples 21 | host $ docker run --rm --name=gitdag -v $(pwd):/files -ti imiell/gitdags /convert_files.sh 22 | host $ ls files 23 | .tex a.png 24 | ``` 25 | 26 | ## Notes 27 | 28 | To change the PDF to "fit" the diagram rather than be a full page sheet, change the document class to: 29 | 30 | ``` 31 | \documentclass[preview]{standalone} 32 | ``` 33 | 34 | Converting the image from pdf to png using: 35 | 36 | ``` 37 | convert -density 300 dagfile.pdf -quality 90 dagfile.png 38 | ``` 39 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.04 2 | RUN apt-get -y update && apt-get install -y wget binutils-multiarch git imagemagick make 3 | RUN wget mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz 4 | RUN tar xzf install-tl-unx.tar.gz 5 | RUN ln -s install-tl-[0-9]* install-tl 6 | WORKDIR install-tl 7 | RUN echo I | ./install-tl 8 | ENV PATH /usr/local/texlive/2017/bin/x86_64-linux:$PATH 9 | RUN latex small2e 10 | RUN tlmgr info pgf 11 | WORKDIR cd $(kpsewhich -var-value=TEXMFHOME) 12 | WORKDIR tex/latex 13 | RUN git clone https://github.com/Jubobs/xcolor-solarized.git 14 | ADD README.md /README.md 15 | ADD HELP.txt /HELP.txt 16 | ADD convert_files.sh /convert_files.sh 17 | RUN echo 'export PATH=/usr/local/texlive/2017/bin/x86_64-linux:${PATH}' >> /root/.bashrc 18 | WORKDIR /root/texmf/tex/latex 19 | RUN git clone https://github.com/Jubobs/gitdags.git 20 | WORKDIR /root 21 | CMD ["cat","/HELP.txt"] 22 | -------------------------------------------------------------------------------- /examples/1.4.1.tex: -------------------------------------------------------------------------------- 1 | % graph LR 2 | % A(A) -- master branch --> B(B) 3 | % A -- newfeature branch --> C(C <- HEAD) 4 | \documentclass[preview]{standalone} 5 | \usepackage{subcaption} 6 | \usepackage{gitdags} 7 | \begin{document} 8 | \begin{figure} 9 | \begin{subfigure}[b]{\textwidth} 10 | \centering 11 | \begin{tikzpicture} 12 | % Commit DAG 13 | \gitDAG[grow right sep = 2em]{ 14 | A -- { 15 | B, 16 | C, 17 | } 18 | }; 19 | % Branch 20 | \gitbranch 21 | {newfeature} % node name and text 22 | {below=of C} % node placement 23 | {C} % target 24 | \gitbranch 25 | {master} % node name and text 26 | {above=of B} % node placement 27 | {B} % target 28 | % HEAD reference 29 | \gitHEAD 30 | {above=of master} % node placement 31 | {master} % target 32 | \end{tikzpicture} 33 | \end{subfigure} 34 | \end{figure} 35 | \end{document} 36 | -------------------------------------------------------------------------------- /examples/1.1.2.tex: -------------------------------------------------------------------------------- 1 | % graph LR 2 | % A --> B 3 | % B --> C 4 | % C -- experimental branch --> F 5 | % C -- master branch --> D 6 | % D --> E 7 | \documentclass[preview]{standalone} 8 | \usepackage{subcaption} 9 | \usepackage{gitdags} 10 | \begin{document} 11 | \begin{figure} 12 | \begin{subfigure}[b]{\textwidth} 13 | \centering 14 | \begin{tikzpicture} 15 | % Commit DAG 16 | \gitDAG[grow right sep = 2em]{ 17 | A -- B -- C -- { 18 | D -- E, 19 | F, 20 | } 21 | }; 22 | % Branch 23 | \gitbranch 24 | {experimental} % node name and text 25 | {below=of F} % node placement 26 | {F} % target 27 | \gitbranch 28 | {master} % node name and text 29 | {above=of E} % node placement 30 | {E} % target 31 | % HEAD reference 32 | \gitHEAD 33 | {above=of master} % node placement 34 | {master} % target 35 | \end{tikzpicture} 36 | \end{subfigure} 37 | \end{figure} 38 | \end{document} 39 | -------------------------------------------------------------------------------- /examples/1.5.2.tex: -------------------------------------------------------------------------------- 1 | % graph LR 2 | % A-->B 3 | % B-->C 4 | % C-- experimental branch -->E 5 | % E-->H 6 | % C-- master branch -->F 7 | % F-->G 8 | % G-- merged with H -->I 9 | % H-- merged with G -->I(I <- HEAD) 10 | \documentclass[preview]{standalone} 11 | \usepackage{subcaption} 12 | \usepackage{gitdags} 13 | \begin{document} 14 | \begin{figure} 15 | \begin{subfigure}[b]{\textwidth} 16 | \centering 17 | \begin{tikzpicture} 18 | % Commit DAG 19 | \gitDAG[grow right sep = 2em]{ 20 | A -- B -- C -- D -- { 21 | E -- H -- I, 22 | F -- G -- I, 23 | } 24 | }; 25 | % Branch 26 | \gitbranch 27 | {experimental} % node name and text 28 | {below=of I} % node placement 29 | {I} % target 30 | \gitbranch 31 | {master} % node name and text 32 | {above=of I} % node placement 33 | {I} % target 34 | \gitbranch 35 | {merge of H and G} % node name and text 36 | {above=of E} % node placement 37 | {I} % target 38 | % HEAD reference 39 | \gitHEAD 40 | {above=of master} % node placement 41 | {master} % target 42 | \end{tikzpicture} 43 | \end{subfigure} 44 | \end{figure} 45 | \end{document} 46 | -------------------------------------------------------------------------------- /examples/subcaption.tex: -------------------------------------------------------------------------------- 1 | \documentclass[preview]{standalone} 2 | \usepackage{subcaption} 3 | \usepackage{gitdags} 4 | \begin{document} 5 | \begin{figure} 6 | \begin{subfigure}[b]{\textwidth} 7 | \centering 8 | \begin{tikzpicture} 9 | % Commit DAG 10 | \gitDAG[grow up sep = 1em]{ 11 | A -- B -- { 12 | C, 13 | D -- E, 14 | } 15 | }; 16 | % Tag reference 17 | \gittag 18 | [v0p1] % node name 19 | {v0.1} % node text 20 | {above=of A} % node placement 21 | {A} % target 22 | % Remote branch 23 | \gitremotebranch 24 | [origmaster] % node name 25 | {origin/master} % node text 26 | {above=of C} % node placement 27 | {C} % target 28 | % Branch 29 | \gitbranch 30 | {master} % node name and text 31 | {above=of E} % node placement 32 | {E} % target 33 | % HEAD reference 34 | \gitHEAD 35 | {above=of master} % node placement 36 | {master} % target 37 | \end{tikzpicture} 38 | \subcaption{Before\ldots} 39 | \end{subfigure} 40 | \begin{subfigure}[b]{\textwidth} 41 | \centering 42 | \begin{tikzpicture} 43 | \gitDAG[grow right sep = 2em]{ 44 | A -- B -- { 45 | C -- D' -- E', 46 | {[nodes=unreachable] D -- E }, 47 | } 48 | }; 49 | % Tag reference 50 | \gittag 51 | [v0p1] % node name 52 | {v0.1} % node text 53 | {above=of A} % node placement 54 | {A} % target 55 | % Remote branch 56 | \gitremotebranch 57 | [origmaster] % node name 58 | {origin/master} % node text 59 | {above=of C} % node placement 60 | {C} % target 61 | % Branch 62 | \gitbranch 63 | {master} % node name and text 64 | {left=of E'} % node placement 65 | {E'} % target 66 | % HEAD reference 67 | \gitHEAD 68 | {above=of master} % node placement 69 | {master} % target 70 | \end{tikzpicture} 71 | \subcaption{\ldots{} and after \texttt{git rebase origin/master}} 72 | \end{subfigure} 73 | \caption{Demonstrating a typical \texttt{rebase}} 74 | \end{figure} 75 | \end{document} 76 | -------------------------------------------------------------------------------- /examples/experiment.tex: -------------------------------------------------------------------------------- 1 | \documentclass[preview]{standalone} 2 | \usepackage{subcaption} 3 | \usepackage{gitdags} 4 | \begin{document} 5 | \begin{figure} 6 | \begin{subfigure}[b]{\textwidth} 7 | \centering 8 | \begin{tikzpicture} 9 | % Commit DAG 10 | \gitDAG[grow right sep = 1em]{ 11 | A -- B -- F -- G -- H -- I -- { 12 | C, 13 | D -- E, 14 | } 15 | }; 16 | % Tag reference 17 | % gitdags.sty:\newcommand\SAandWT{% 18 | % gitdags.sty:\newcommand\toSAorWT[2]{% 19 | % gitdags.sty:\newcommand\toSAfrom[1]{\toSAorWT{#1}{stagingarea}} 20 | % gitdags.sty:\newcommand\toWTfrom[1]{\toSAorWT{#1}{workingtree}} 21 | % gitdags.sty:\newcommand\gitDAG[1][]{\graph[DAG,#1]} 22 | 23 | % gitdags.sty:\newcommand\gitblob[2][] 24 | \toSAandWT 25 | \gitblob 26 | {gitblob} % node text 27 | {above=of A} % node placement 28 | {A} % target 29 | % gitdags.sty:\newcommand\gitblobmc[1]{% 30 | % For merge conflicts 31 | \gitblobmc 32 | {above=of C} % node placement 33 | {C} % target 34 | \gittag 35 | [v0p1] % node name 36 | {v0.1} % node text 37 | {above=of D} % node placement 38 | {D} % target 39 | % Remote branch 40 | \gitremotebranch 41 | [origmaster] % node name 42 | {origin/master} % node text 43 | {above=of F} % node placement 44 | {F} % target 45 | % Branch 46 | \gitbranch 47 | {master} % node name and text 48 | {above=of E} % node placement 49 | {E} % target 50 | % HEAD reference 51 | \gitHEAD 52 | {above=of master} % node placement 53 | {master} % target 54 | \end{tikzpicture} 55 | \subcaption{Before\ldots} 56 | \end{subfigure} 57 | \begin{subfigure}[b]{\textwidth} 58 | \centering 59 | \begin{tikzpicture} 60 | \gitDAG[grow right sep = 2em]{ 61 | A -- B -- { 62 | C -- D' -- E', 63 | {[nodes=unreachable] D -- E }, 64 | } 65 | }; 66 | % Tag reference 67 | \gittag 68 | [v0p1] % node name 69 | {v0.1} % node text 70 | {above=of A} % node placement 71 | {A} % target 72 | % Remote branch 73 | \gitremotebranch 74 | [origmaster] % node name 75 | {origin/master} % node text 76 | {above=of C} % node placement 77 | {C} % target 78 | % Branch 79 | \gitbranch 80 | {master} % node name and text 81 | {left=of E'} % node placement 82 | {E'} % target 83 | % HEAD reference 84 | \gitHEAD 85 | {above=of master} % node placement 86 | {master} % target 87 | \end{tikzpicture} 88 | \subcaption{\ldots{} and after \texttt{git rebase origin/master}} 89 | \end{subfigure} 90 | \caption{Demonstrating a typical \texttt{rebase}} 91 | \end{figure} 92 | \end{document} 93 | --------------------------------------------------------------------------------