Я видел, что в некоторых книгах и статьях есть действительно симпатичные графики веток и коммитов git. Как я могу сделать высококачественные печатные изображения из истории Git?
Я видел, что в некоторых книгах и статьях есть действительно симпатичные графики веток и коммитов git. Как я могу сделать высококачественные печатные изображения из истории Git?
Ответы:
Обновление: Этот ответ привлек гораздо больше внимания, чем заслуживает. Первоначально он был опубликован, потому что я думаю, что графики выглядят хорошо, и их можно нарисовать в Illustrator для публикации - и лучшего решения не было. Но теперь существует гораздо больше применимых ответов на этот вопрос, таких как fracz , Jubobs или Harry Lee ! Пожалуйста, поднимите голос!
Обновление 2: я разместил улучшенную версию этого ответа в топологии ветвления Визуализация в git вопросе, так как это гораздо более уместно там. Эта версия включает в себя информацию lg3
об авторе и коммиттере, так что вы действительно должны это проверить. Оставив этот ответ по историческим (& rep, я признаю) причинам, хотя мне очень хочется просто удалить его.
Мои 2 ¢ : у меня есть два псевдонима, которые я обычно добавляю в мой ~/.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
выглядит так:
и git lg2
выглядит так:
#202020
/ #555555
, красный: #5d1a14
/ #da4939
, зеленый: #424e24
/ #a5c261
, желтый: #6f5028
/ #ffc66d
, синий: #263e4e
/ #6d9cbe
, пурпурный: #3e1f50
/ #a256c7
, голубой: #234e3f
/ #62c1a1
и белый: #979797
/ #ffffff
.
--date=relative
и --abbrev-commit
избыточны, потому что вы явно используете %cr
и %h
, соответственно.
%C(auto)
модификатор в refnames ( %d
), чтобы получить более приятные цвета. См 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
Многие из ответов здесь хороши, но для тех, кто просто хочет получить ответ в одну строку без указания псевдонимов или чего-то еще, вот он:
git log --all --decorate --oneline --graph
Не все будут делать git log
все время, но когда вам это нужно, просто помните:
« Собака » = мерзавец журнал - LL - д ecorate - о neline - г Раф
git config --global alias.adog "log --all --decorate --oneline --graph"
--all
что собираюсь заплакать (T_T). СПАСИБО!
Для текстового вывода вы можете попробовать:
git log --graph --abbrev-commit --decorate --date=relative --all
или:
git log --graph --oneline --decorate --all
или: вот псевдоним graphviz для рисования графа DAG.
oneline
версию short ( ) большую часть времени, но если мне нужно больше подробностей, используйте длинную версию с полная информация о коммите. Тогда у меня есть два хороших отображения <leader>gl
(короткий) и <leader>gll
(длинный) в Vim.
Gitgraph.js позволяет рисовать красивые ветки Git без репозитория. Просто напишите код Javascript, который настраивает ваши ветки и коммиты и отображает их в браузере.
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);
или с metro
шаблоном:
или с сообщениями о коммитах, авторами и тегами:
Проверьте это с помощью JSFiddle .
Создайте его с помощью Git Grapher от @bsara.
Небольшой пакет LaTeX, созданный на основе TikZ & PGF , gitdags
позволяет без труда создавать графики фиксации векторной графики и многое другое.
Автоматическая генерация графа коммитов существующего репозитория не является целью gitdags
; графики, которые он производит, предназначены только для образовательных целей .
Я часто использую его для создания графиков для моих ответов на вопросы Git, в качестве альтернативы графам коммитов ASCII:
Вот пример такого графика, демонстрирующего эффекты простой перебазировки:
\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
для генерации dvi, а затем, наконец, использовать dvisvgm input.dvi
создать SVG с прозрачностью. Преобразование из SVG в растровый формат, такой как PNG, достаточно просто convert -antialias -density 300 -background none input.svg output.png
. Кстати, эти изображения выглядят потрясающе с полной прозрачностью. Все еще работаем над проблемой шрифтов ... i.imgur.com/1Xu2Ry5.png
gitdags
уже в пути!
Gitg - это клон Gitk и GitX для GNOME (он также работает на KDE и т. Д.), Который показывает довольно цветной график.
Он активно развивается (по состоянию на 2012 год). Это позволяет сортировать коммиты (узлы графа) либо в хронологическом, либо в топологическом отношении , а также скрывать коммиты, которые не ведут к выбранной ветви.
Он отлично работает с большими репозиториями и сложными графами зависимостей.
Примерные скриншоты с репозиториями linux-git и linux-2.6:
Я только что написал один инструмент, который может генерировать симпатичные графы коммитов с помощью HTML / Canvas.
И предоставить плагин JQuery, который делает его простым в использовании.
[github] https://github.com/tclh123/commits-graph
Предварительный просмотр:
Sourcetree действительно хороший. Он выводит на экран красивый и средний размер истории и ветвления: (следующее делается на экспериментальном проекте Git, чтобы увидеть некоторые ветки). Поддерживает Windows 7+ и Mac OS X 10.6+.
git-forest
это отличный Perl-скрипт, которым я пользуюсь больше года, и я больше не использую git log
команду напрямую.
Вот некоторые вещи, которые мне нравятся в этом сценарии:
--reverse
с выводом графика, что невозможно с помощью обычной git log
команды.git log
внутренне для получения списка коммитов, поэтому все опции, которые вы передаете, git log
также могут быть переданы в этот скрипт.У меня есть псевдоним, используя git-forest
следующее:
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
Вот как выглядит вывод на терминале:
Я написал веб-инструмент для преобразования журналов git в красивые SVG-графики: Bit-Booster - инструмент для рисования графиков в автономном режиме
Загрузите вывод git log --pretty='%h|%p|%d'
непосредственно в инструмент, а затем нажмите ссылку «download graph.svg».
Этот инструмент предназначен исключительно для клиентской части, поэтому никакие ваши данные Git не передаются на мой сервер. Вы также можете сохранить HTML + JS локально и запустить его, используя URL-адреса "file: ///". Проверено на Chrome 48 и Firefox 43 на Ubuntu 12.04.
Он генерирует HTML, который может быть размещен непосредственно на любой странице (включая движок блогов blogpot!). Посмотрите на некоторые сообщения в блоге здесь:
http://bit-booster.blogspot.ca/
Вот скриншот образца HTML-файла, сгенерированного инструментом:
http://bit-booster.com/graph.html (инструмент)
Основываясь на скрипте Graphviz, который я нашел в ответе на связанный вопрос , я взломал скрипт ruby, который создает сводное представление хранилища git. Он исключает всю линейную историю и просто показывает «интересные» коммиты, то есть те, у которых несколько родителей, несколько детей или на которые указывает ветка или тег. Вот фрагмент графика, который он генерирует для jquery :
git-big-picture и BranchMaster - похожие инструменты, которые пытаются показать только высокоуровневую структуру графика, показывая только то, как связаны теги, ветви, слияния и т. д.
У этого вопроса есть еще несколько вариантов.
Я добавил три пользовательских команд: git tree
, git stree
и git vtree
. Я пойду по ним в таком порядке.
[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)'
С git stree
и git vtree
я использую Bash, чтобы помочь с форматированием.
[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);"'
РЕДАКТИРОВАТЬ: Это работает с GIT версии 1.9a. Значение цвета 'auto', по-видимому, дебютирует в этом выпуске. Это хорошее дополнение, потому что названия ветвей получат другой цвет. Это облегчает различие между локальной и удаленной ветвями, например.
fatal: bad color value 'auto' for variable '--pretty format'
:(
sed: illegal option -- r
Зависит от того, как они выглядели. Я использую gitx, который делает такие картинки:
Вы можете сравнить git log --graph
с gitk в слиянии осьминога с 24 путями (первоначально от http://clojure-log.n01se.net/date/2008-12-24.html ):
Для более подробного текстового вывода, пожалуйста, попробуйте:
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
Вы можете написать псевдоним в $ HOME / .gitconfig
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
git hist
- Показать историю текущей ветки
git hist --all
- Показать график всех филиалов (включая пульты)
git hist master devel
- Показать отношения между двумя или более ветвями
git hist --branches
- Показать все местные филиалы
Добавить --topo-order
для сортировки фиксирует топологию, а не по дате (по умолчанию в этом псевдониме)
--decorate
, так с разными цветами для разных названий веток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)'"
gitg : средство просмотра репозитория на основе gtk, это новое, но интересное и полезное
http://git.gnome.org/browse/gitg
Я использую его в настоящее время
GitX
и довольно хороший. Рекомендую
Хотя иногда я использую gitg , всегда возвращаюсь к командной строке:
[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
Как вы можете видеть, это почти клавиатурные псевдонимы, основанные на:
Смотрите в последней версии git (1.8.5 и выше) вы можете воспользоваться% C (авто) в декорации заполнителя% d
Отсюда все, что вам нужно, это хорошее понимание gitrevisions для фильтрации всего, что вам нужно (что-то вроде master..develop, где --simplify-merges может помочь с долгосрочными ветвями)
Мощь командной строки - это быстрое конфигурирование, основанное на ваших потребностях (понимайте, что репозиторий не является уникальной конфигурацией журнала ключей, поэтому иногда необходимо добавить --numstat, или --raw, или --name-status. Здесь git log и псевдонимы быстрые, мощные и (со временем) самый красивый график, который вы можете достичь. Более того, с выводом по умолчанию через пейджер (скажем, меньше) вы всегда можете быстро искать в результатах. Не уверен? Вы всегда можете проанализировать результат с такими проектами, как gitgraph
Слегка подправив удивительный ответ Слиппа , вы можете использовать его псевдонимы, чтобы регистрировать только одну ветку:
[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"
Оставив --all
, теперь вы можете сделать
git lgBranch1 <branch name>
или даже
git lgBranch1 --all
Я предлагаю tig
https://github.com/jonas/tig
, намного лучший инструмент командной строки для git.
Вы можете использовать homebrew для установки TIG на MacOS:
$ brew install tig
$ tig
У меня есть этот git log
псевдоним ~/.gitconfig
для просмотра истории графа:
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
С этим на месте, git l
будет выводить что-то вроде:
В Git 2.12 + вы даже можете настроить цвета линий графика, используя log.graphColors
опцию конфигурации.
Что касается формата логов, то он похож --oneline
на добавление имени автора (с уважением .mailmap
) и относительной даты автора . Обратите внимание, что %C(auto)
синтаксис, который говорит Git использовать цвета по умолчанию для хэша коммита и т. Д., Поддерживается в Git> = 1.8.3 .
git log --graph --oneline
просто чтобы убедиться, что он не потерян
git -c core.pager='less -SRF' log --oneline --graph --decorate
Это мой окончательный вариант, похожий на многие ответы здесь. Мне нравится корректировать передаваемые флаги, less
чтобы предотвратить перенос слов.
Я установил псевдоним для быстрого доступа, так как команда немного громоздка.
Попробуйте Дитаа . Он может преобразовать любую диаграмму ASCII в изображение. Хотя он не был разработан с учетом веток Git, я был впечатлен результатами.
Источник (текстовый файл):
+--------+
| hotfix |
+---+----+
|
--*<---*<---*
^
|
\--*<---*
|
+---+----+
| master |
+--------+
Команда:
java -jar ditaa0_9.jar ascii-graph.txt
Результат:
Он также поддерживает цвета фона, пунктирные линии, различные формы и многое другое. Смотрите примеры .
Если ваш репозиторий находится на Gitlab, вы можете использовать его графическое представление, так как оно отображается в вашем браузере как SVG.
Перейдите к графическому представлению вашего хранилища, например, https://gitlab.com/gitlab-org/gitter/webapp/network/develop.
Прокрутите график вниз до дна (это ленивые загрузки фиксирует!)
Используйте инспектор вашего браузера, чтобы скопировать элемент SVG в новый файл
Откройте его в выбранном вами рендерере, например Inkscape
Я не знаю о прямом инструменте, но, возможно, вы можете взломать скрипт, чтобы экспортировать данные в точечный формат и визуализировать его с помощью Graphviz.
io
команд на простые команды perl `git log [...]` работало для меня.
brew install perl dot
и затем cpan common::sense IO::all
получить зависимости. Затем просто передайте вывод соответствующей команде, например git-graphviz | dot -Tpng -o repo.png
. Однако вывод не сильно отличается от git-big-picture .
В качестве одной из демоверсий библиотеки веб-графики Raphael есть забавный граф коммитов Git .
Демонстрация является статической, но должно быть достаточно просто взять код и обменять их статические данные на живой набор данных - я думаю, что это просто данные Git commit в формате JSON.
Демоверсия здесь: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
Хороший и чистый вид табличного git-графика для оболочек
с хэшами, как обычно, помимо дерева графов
или в дополнительном столбце
Изменить : Вы хотите начать прямо сейчас, не читая объяснения? Используйте псевдонимы git, скрипты или фрагменты кода функций из раздела EDIT 5 ниже или даже самый удобный способ с EDIT 6 .
Во всех ответах на этот вопрос ни один из них не показал чистого табличного вида для оболочек. Наиболее близким был этот ответ от господа, откуда я начал.
Суть моего подхода заключается в подсчете только тех символов дерева, которые показаны пользователю. Затем заполните их до личной длины пробелами.
Кроме мерзавца вам нужны эти инструменты
в основном на борту с любым дистрибутивом Linux.
Фрагмент кода
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")
Для расчета необходимых пробелов мы используем
sed -nl1000 'l' <<< "$graph"
получить все символы (до 1000 на строку), кроме выбора только символов дерева: * | / \ _ и пробелы с
grep -Eo '\\\\|\||\/|\ |\*|_'
наконец, подсчитайте их и вычтите результат из выбранного нами значения длины, которое в примере равно 9.
Для получения рассчитанного количества пробелов мы используем
seq -s' ' $whitespaces
и обрезать номера позиций с
tr -d '[:digit:]'
чем добавить их в конец нашей линии графа. Это оно!
У Git есть хорошая опция для форматирования длины выходных спецификаторов уже с синтаксисом'%><(amount_of_characters,truncate_option)'
, который добавляет пробелы с левой стороны '>' или справа '<' и может обрезать символы с начала 'ltrunc', середины 'mtrunc' или конца 'TRUNC.
Это важно , что выше использование PRINTF CMD то же значение длины для соответствующего столбца мерзавца.
Получайте удовольствие от того, чтобы создать свой собственный чистый, похожий на стол выход для ваших нужд.
Дополнительно:
Чтобы получить правильное значение длины, вы можете использовать следующий фрагмент
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:' ')
и используйте $ max_chars в качестве правильного значения длины выше.
РЕДАКТИРОВАТЬ 1 : Только что заметил, что символ подчеркивания также используется в дереве git и соответственно отредактируйте фрагменты кода выше. Если отсутствуют другие символы, пожалуйста, оставьте комментарий.
РЕДАКТИРОВАТЬ 2 : Если вы хотите избавиться от скобок вокруг записей веток и тегов, просто используйте «% D» вместо «% d» в команде git, как в EDIT 3.
РЕДАКТИРОВАТЬ 3 : Может быть, цветовая опция "auto" больше всего подходит для записей веток и тегов?
Измените эту часть команды git (цвет 214 )
%C(214)%>(15,trunc)%D%C(reset)
к авто
%C(auto)%>(15,trunc)%D%C(reset)
РЕДАКТИРОВАТЬ 4 : Или вам нравится ваша собственная цветовая смесь для этой части, причудливый вывод с мигающей головой?
Чтобы иметь возможность сначала стилизовать заголовок, имена веток и теги, нам нужна опция «auto» color в нашей команде git, как в EDIT 3.
Затем мы можем заменить известные значения цвета нашими собственными, добавив эти 3 строки
# 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}
прямо перед линией
branch_all="$branch_all$(printf '%15s' "$branch")\n"
в нашем фрагменте кода. Значения замены производят цвета выше.
Например, значение замены для головы
3;5;1;38;5;196
где 3; обозначает курсив, 5; для мигания и 1; 38; 5; 196 для цвета. Для получения дополнительной информации начните здесь. Примечание. Это поведение зависит от вашего любимого терминала и, следовательно, может быть неприменимо.
НО вы можете выбрать любое значение цвета, которое вы предпочитаете.
ОБЗОР значений git color и эквивалентов ANSI
Вы найдете список с git color / style option здесь .
Если вам нужен вывод на вашу консоль для получения точных цветов (рисунок выше уменьшен с помощью stackoverflow), вы можете произвести вывод с помощью
for ((i=0;i<=255;i++));do
while IFS='+' read -r tree hash;do
echo -e "$(printf '%-10s' "(bold $i)") $hash $(sed -nl500 'l' <<< "$hash"|grep -Eom 1 '[0-9;]*[0-9]m'|tr -d 'm')"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold '$i')%h%C(reset)'|head -n 1)
done
в пути вашего проекта git, который использует первый коммит из вашего вывода журнала git.
РЕДАКТИРОВАТЬ 5 : Как отметил член "Андрас Дик", есть несколько способов использования этого кода:
1) как псевдоним :
псевдоним не принимает параметры, но функция может , поэтому просто укажите в вашем .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" ###
}
и вызовите функцию git_bly (полученную из tablelike) непосредственно по пути вашего проекта git или из любого места, где путь к вашему проекту git является первым параметром.
2) в качестве shell-скрипта :
Я использую его с возможностью передать каталог проекта git в качестве первого параметра или, если он пуст, взять рабочий каталог как обычное поведение. В целом мы имеем
# edit your color/style preferences here or use empty values for git auto style
tag_style="1;38;5;222"
head_style="1;3;5;1;38;5;196"
branch_style="38;5;214"
# determine the max character length of your git tree
while IFS=+ read -r graph;do
chars_count=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
[[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count
done < <(cd "${1:-"$PWD"}" && git log --all --graph --pretty=format:' ')
# create the columns for your prefered tablelike git graph output
while IFS=+ read -r graph hash time branch message;do
# count needed amount of whitespaces and create them
whitespaces=$(($max_chars-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')
# show hashes besides the tree ...
#graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"
# ... or in an own column
graph_all="$graph_all$graph$whitespaces\n"
hash_all="$hash_all$(printf '%7s' "$hash") \n"
# format all other columns
time_all="$time_all$(printf '%12s' "$time") \n"
branch=${branch//1;32m/${branch_style:-1;32}m}
branch=${branch//1;36m/${head_style:-1;36}m}
branch=${branch//1;33m/${tag_style:-1;33}m}
branch_all="$branch_all$(printf '%15s' "$branch")\n"
message_all="$message_all$message\n"
done < <(cd "${1:-"$PWD"}" && git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)' && echo);
# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")
3) в качестве псевдонима git :
Возможно, самый удобный способ - добавить псевдоним git в ваш .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\"); \
'"
Чем просто позвонить git tably
по любому пути проекта.
Git настолько мощен, что вы можете изменить заголовок, теги, ... прямо как показано выше и взято отсюда .
Другой модный вариант - выбрать цвета дерева, которые вы предпочитаете больше всего.
[log]
graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan
это дает вам сумасшедший вид, но всегда табличный вывод журнала git
Слишком много миганий! Просто чтобы продемонстрировать, что это возможно. Слишком мало указанных цветов приводит к повторению цветов.
Полная ссылка .gitconfig находится всего в одном клике.
РЕДАКТИРОВАТЬ 6 :
Из-за ваших положительных голосов я улучшил фрагмент. Теперь вы можете передать его практически любой командой git log и больше не нужно адаптировать код. Попробуй это!
Как это работает?
Тогда просто позвони
git tably YourLogAlias
или
git tably YourLogAlias TreeColNumber
где TreeColNumber перезаписывает всегда определенное значение сверху.
Limitiation:
перед каждым заполнителем коммитов в вашей команде log вы должны использовать этот синтаксис с одним из параметров усечения
%><(<N>[,ltrunc|mtrunc|trunc])
(кроме последнего, если выбранный вами столбец дерева не самый последний)
(объяснения синтаксиса см. https://git-scm.com/docs/pretty-formats )
если добавить другие символы для украшения , как (committer:
, <
и , >)
как и в
...%C(dim white)(committer: %<(15,trunc)%cn%<(25,trunc)<%ce>)%C(reset)...
вы получите только табличный вывод с графиком в первом столбце
YourLogAlias-col
Теперь улучшенный фрагмент для вашего .gitconfig
[color "decorate"]
HEAD = bold blink italic 196
branch = 214
tag = bold 222
[alias]
# delimiter used in every mylog alias as column seperator
delim = ^
# short overview about the last hashes without graph
mylog = log --all --decorate=short --color --pretty=format:'^%C(dim white)%>(12,trunc)%cr%C(reset)^%C(bold 214)%<(7,trunc)%h%C(reset)' -5
# log with hashes besides graph tree
mylog2 = 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)%<(80,trunc)%s%C(reset)'
mylog2-col= 3
# log with hashes in an own column and more time data
mylog3 = log --all --graph --decorate=short --color --pretty=format:'^%C(dim white)%>(12,trunc)%cr%C(reset)^%C(cyan)%<(10,trunc)%cs%C(reset)^%C(bold 214)%<(7,trunc)%h%C(reset)^%C(auto)%<(15,trunc)%D%C(reset)^%C(white)%s%C(reset)'
mylog3-col= 4
tably = !bash -c '" \
delim=$(git config alias.delim); \
git_log_cmd=$(git config alias.$1); \
git_tre_col=${2:-$(git config alias.$1-col)}; \
\
i=0; \
while read -d\"$delim\" -r col_info;do \
((i++)); \
col_length[$i]=$(grep -Eo \"\\([0-9]*,[lm]*trunc\\)\" <<< \"$col_info\" | grep -Eo \"[0-9]*\" | head -n 1); \
done <<< \"$(grep -Eo \"(pretty|format)=format.*\" <<< \"$git_log_cmd$delim\")\"; \
\
while IFS= read -r graph;do \
chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
[[ ${chars_count:-0} -gt ${col_length[1]:-0} ]] && col_length[1]=$chars_count; \
done < <([[ -n \"$(grep -F graph <<< \"$git_log_cmd\")\" ]] && git log --all --graph --pretty=format:\" \" && echo); \
\
while IFS= read -r line;do \
j=0; \
while IFS= read -d\"$delim\" -r col_content;do \
((j++)); \
if [[ $j -eq 1 ]];then \
chars=$(sed -nl1000 \"l\" <<< \"$col_content\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
whitespaces=$((${col_length[1]}-$chars)); \
whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\"); \
col_content[1]=\"${col_content[1]}$col_content$whitespaces\n\"; \
else \
col_content[$j]=\"${col_content[$j]}$(printf \"%${col_length[$j]}s\" \"$col_content\") \n\"; \
fi; \
done <<< \"$line$delim\"; \
for ((k=$j+1;k<=$i;k++));do \
col_content[$k]=\"${col_content[$k]}$(printf \"%${col_length[$k]}s\" \"\") \n\"; \
done; \
done < <(git $1 && echo); \
\
while read col_num;do \
if [[ -z \"$cont_all\" ]];then \
cont_all=${col_content[$col_num]}; \
else \
cont_all=$(paste -d\" \" <(echo -e \"$cont_all\") <(echo -e \"${col_content[$col_num]}\")); \
fi; \
done <<< $(seq 2 1 ${git_tre_col:-1};seq 1;seq $((${git_tre_col:-1}+1)) 1 $i); \
echo -e \"$cont_all\"; \
"' "git-tably"
Результаты:
или с новым TreeColNumber на лету
ОПЯТЬ: весело проведите время, чтобы оформить свой собственный чистый, похожий на стол вывод для своих нужд.
некоторые псевдонимы в ~ / .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'
Для пользователей OSX я взял пример @gospes и немного изменил его для gsed ( gnu-sed
установленного через homebrew) и откорректировал цвета (для работы с черным фоном, не зная, как оригинальный пример может отобразить то же, что и в пример, поскольку он указывает черный текст на терминале с черным фоном).
[alias]
# tree, vtree, stree support
logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(bold black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++ %C(bold black)%an%C(reset)%C(bold black): %s%C(reset)'
tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n %C(bold black)[%cr]%C(reset) %x09%C(bold black)%an: %s %C(reset)'
stree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
done < <(git logx && echo);"' | less -r
vtree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
done < <(git logx && echo);"' | less -r
Ключом для OSX является сначала установить gnu sed (которая имеет опцию -r). Проще всего это сделать с помощью homebrew, который не будет перезаписывать установленный системой sed, но вместо этого установит gnu sed как «gsed». Надеюсь, это поможет @ SlippD. Thompson, который прокомментировал выше о том, что OSX не работает.