Симпатичные графы веток

1385

Я видел, что в некоторых книгах и статьях есть действительно симпатичные графики веток и коммитов git. Как я могу сделать высококачественные печатные изображения из истории Git?

krosenvold
источник
4
Я создал скрипт Python для создания графика graphiz! Взглянуть. github.com/chode/git-graph
Стефан Бехтер
4
Если вы хотите качественный и пригодный для печати, мой инструмент ( bit-booster.com/graph.html ) преобразует «git log» в SVG. Для получения дополнительной информации см. Мой ответ .
Дж. Сильви Дэвис
2
Вы ищете инструмент для визуализации своей собственной истории Git или инструмент для построения диаграмм, который позволяет рисовать симпатичные «ветви Git»?
Ури Абрамсон
1
Возможный дубликат визуализации топологии ветви в git
trblnc
5
Я бы удалил тег направленные-ациклические графы, потому что он не имеет отношения к этому вопросу
Максим Дмитриев

Ответы:

1843

Обновление: Этот ответ привлек гораздо больше внимания, чем заслуживает. Первоначально он был опубликован, потому что я думаю, что графики выглядят хорошо, и их можно нарисовать в 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выглядит так:
мерзавец LG1

и git lg2выглядит так:
мерзавец LG2

Слипп Д. Томпсон
источник
35
Да, я делаю. Обычные и яркие / полужирные цвета: черный #202020/ #555555, красный: #5d1a14/ #da4939, зеленый: #424e24/ #a5c261, желтый: #6f5028/ #ffc66d, синий: #263e4e/ #6d9cbe, пурпурный: #3e1f50/ #a256c7, голубой: #234e3f/ #62c1a1и белый: #979797/ #ffffff.
Слипп Д. Томпсон
3
@ Турбо: Для меня цвета меняются в настройках профиля для моего приложения терминала (Terminal.app). Используемое вами терминальное приложение может поддерживать или не поддерживать изменение отображаемых цветов для данных цветов ANSI. Кроме того, тире (точнее, тире) была создана с помощью опции-shift- [дефис-минус ключ]. Я полагаю, что я ошибочно предположил, что все текущие платформы работают с Unicode.
Слипп Д. Томпсон
3
Ваши --date=relativeи --abbrev-commitизбыточны, потому что вы явно используете %crи %h, соответственно.
серый
6
Я бы добавил %C(auto)модификатор в refnames ( %d), чтобы получить более приятные цвета. См stackoverflow.com/questions/5889878/color-in-git-log/...
Josef Eisl
2
Отличный ответ. Я изменил команду так, чтобы она выглядела больше как вывод --oneline --decorate с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
Крейгом Мотлином
1202

Многие из ответов здесь хороши, но для тех, кто просто хочет получить ответ в одну строку без указания псевдонимов или чего-то еще, вот он:

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

Не все будут делать git logвсе время, но когда вам это нужно, просто помните:

« Собака » = мерзавец журнал - LL - д ecorate - о neline - г Раф

введите описание изображения здесь

Патоши パ ト シ
источник
253
git config --global alias.adog "log --all --decorate --oneline --graph"
17
4
Я так долго искал, --allчто собираюсь заплакать (T_T). СПАСИБО!
Фелипе Джерард
2
--oneline был представлен в Git 1.6.3: github.com/git/git/blob/… --pretty = oneline будет работать с версиями Git до 1.6.3
Пэт Мирон
13
лучший ответ на ТАК. Спасибо за то, что держали это беззаботно.
Тобиас Фейл
4
Я думаю, что «--decorate» теперь включено по умолчанию. Но я все равно запомню аббревиатуру!
Джозия Йодер
379

Для текстового вывода вы можете попробовать:

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

или:

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

или: вот псевдоним graphviz для рисования графа DAG.

Я лично использую gitx, gitk --allи gitnub.

КЕО
источник
Мне нравятся эти два, так как они хорошо разделены между «git log» (short) и «git log» (long), поэтому я могу вызывать onelineверсию short ( ) большую часть времени, но если мне нужно больше подробностей, используйте длинную версию с полная информация о коммите. Тогда у меня есть два хороших отображения <leader>gl(короткий) и <leader>gll(длинный) в Vim.
icc97
253

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

пример графика, созданного с помощью Gitgraph.js

или с metroшаблоном:

GitGraph.js тема метро

или с сообщениями о коммитах, авторами и тегами:

GitGraph с коммитом сообщений

Проверьте это с помощью JSFiddle .

Создайте его с помощью Git Grapher от @bsara.

fracz
источник
3
Да, это совершенно потрясающе! Разместите его в скрипте jsfiddle.net/guan1oz1, чтобы вы могли проверить это прямо сейчас.
Беркус
14
Стрелки должны указывать на родителей, но не на детей.
jub0bs
4
@Jubobs: Хороший вопрос. Это обычное препятствие для людей, пытающихся понять Git: они думают о последовательности времени, а не о наследовании. Прояснение того, что (почти) все в git относительно чего-то предшествующего, помогает всем остальным стать на свои места.
Слипп Д. Томпсон
6
Относительно направления стрелки из документов: * @param {Boolean} [options.reverseArrow = false] - Сделать стрелки указывающими на предков, если они истинны
Скотт,
2
К вашему сведению, увидев этот пост и поиграв с gitgraph.js, я решил создать небольшой инструмент, который в основном помещает пользовательский интерфейс в gitgraph.js. Это еще не закончено, и пользовательский интерфейс не там, где я хочу, но вклады приветствуются! посмотрите: github.com/bsara/git-grapher
bsara
123

Небольшой пакет 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}
jub0bs
источник
1
@ Это выглядит великолепно! Я также хотел бы несколько строк о том, как его использовать: рассмотрим пользователя Windows, у которого вообще не установлен LaTeX. Как сделать график с нуля?
VonC
1
@VonC Я не уверен, но если вы не хотите устанавливать LaTeX, вы можете создавать свои графики на ShareLatex и WriteLaTeX , и тому подобное. Я буду изучать его и расширять вики, когда у меня будет больше времени ... Не стесняйтесь продвигать пакет:)
jub0bs
Это отличные вещи! Я напишу учебник в какой-то момент, но сейчас я просто хотел упомянуть, что вы можете пост-обработать свои графики с помощью автономного документооборота (я использую функцию обрезки), использовать 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
vmrob
5
Мне потребовалось некоторое время, чтобы заставить это работать, поэтому я написал пошаговое руководство, как заставить гитдаги работать с нуля на Ubuntu 14.04
ChrisFreeman
1
@AndreaPolci См github.com/Jubobs/gitdags/issues/3 для примера слияния. Документация gitdagsуже в пути!
jub0bs
79

Gitg - это клон Gitk и GitX для GNOME (он также работает на KDE и т. Д.), Который показывает довольно цветной график.

Он активно развивается (по состоянию на 2012 год). Это позволяет сортировать коммиты (узлы графа) либо в хронологическом, либо в топологическом отношении , а также скрывать коммиты, которые не ведут к выбранной ветви.

Он отлично работает с большими репозиториями и сложными графами зависимостей.

Примерные скриншоты с репозиториями linux-git и linux-2.6:

линукс-мерзавец

Linux-2.6

Механическая улитка
источник
60

Я только что написал один инструмент, который может генерировать симпатичные графы коммитов с помощью HTML / Canvas.

И предоставить плагин JQuery, который делает его простым в использовании.

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

Предварительный просмотр:

предварительный просмотр

Гарри Ли
источник
Выглядит хорошо, как вы получаете предварительно отформатированные данные для рисования этого графика?
Ольга
3
@ Ольга Я просто добавляю код бэкенда в свой репозиторий. Вы можете просмотреть его на GitHub.
Гарри Ли
60

Sourcetree действительно хороший. Он выводит на экран красивый и средний размер истории и ветвления: (следующее делается на экспериментальном проекте Git, чтобы увидеть некоторые ветки). Поддерживает Windows 7+ и Mac OS X 10.6+.

Пример вывода в Sourcetree

nonopolarity
источник
Он также доступен в App Store, поэтому обновление должно работать автоматически.
WebOrCode
Мне нравится график sourcetree, но я бы предпочел использовать командную строку, а настройки по умолчанию sourcetree всегда портят мои репозитории.
SgtPooki
SourceTree настаивает на том, чтобы вы создали учетную запись Atlassian (или использовали свою учетную запись google и предоставили Atlassian некоторые разрешения для получения электронной почты и информации о профиле), и после установки на Mac (OS X El Capitan v 10.11.5) произойдет сбой на этапе «Клонирование»: "fatal: не найдено сопоставление подмодулей в .gitmodules для пути" <путь пропущен> "", а также странное предупреждение: "шаблоны не найдены / usr / local / git / share / git-core / templates". Очень непонятные сообщения, не очень большие.
Дмитрий Шевкопляс
3
И после удаления не забудьте привести в порядок свои привилегии безопасности Google, которые вы предоставили ранее: myaccount.google.com/security -> Подключенные приложения и сайты -> Приложения, подключенные к вашей учетной записи -> Управление приложениями
Дмитрий Шевкопляс
56

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"

Вот как выглядит вывод на терминале:

введите описание изображения здесь

Tuxdude
источник
3
@ void.pointer - Да, этого не произойдет, потому что git-forest является perl-скриптом и имеет зависимости от perl-модуля. Запуск git под cygwin с установленными необходимыми Perl-модулями может быть лучшей альтернативой, которую вы можете получить, если вы действительно этого хотите в Windows :)
Tuxdude
1
Вау, в этом репо есть много отличных инструментов. Спасибо!
Eldelshell
1
Отлично работает @MinGW (MSYS) под Win $; установить CPANM; затем Git.pm; создайте псевдоним, и вы готовы к работе.
Sektor
что это за очень хороший эмулятор терминала, который вы используете? Мне нравятся вещи с графическим индикатором подсказок.
НХ.
Как установить этот «скрипт»? Я на Ubuntu.
user13107
50

Я написал веб-инструмент для преобразования журналов 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 (инструмент)

Г. Сильви Дэвис
источник
1
@ Джей, кажется, цвет отражает уровень отступа этой конкретной ветви, и эти ветви могут переместиться в другой столбец и, следовательно, изменить цвет.
Thorbjørn Ravn Andersen
44

Основываясь на скрипте Graphviz, который я нашел в ответе на связанный вопрос , я взломал скрипт ruby, который создает сводное представление хранилища git. Он исключает всю линейную историю и просто показывает «интересные» коммиты, то есть те, у которых несколько родителей, несколько детей или на которые указывает ветка или тег. Вот фрагмент графика, который он генерирует для jquery :

образец jquery

git-big-picture и BranchMaster - похожие инструменты, которые пытаются показать только высокоуровневую структуру графика, показывая только то, как связаны теги, ветви, слияния и т. д.

У этого вопроса есть еще несколько вариантов.

Мэтт МакГенри
источник
2
Я попробовал это, но не смог заставить точку работать правильно с выводом для нашего репо (42 ветви, 175 тегов, 42.000 фиксаций) ... Жаль ... Это именно то, что я искал!
Ксавье Нодет
1
@XavierNodet, если ваш репозиторий общедоступен и / или у вас есть сообщение об ошибке и т. Д., Пожалуйста, сообщите о проблеме на GitHub. Спасибо!
Мэтт МакГенри
38

Я добавил три пользовательских команд: 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);"'

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


РЕДАКТИРОВАТЬ: Это работает с GIT версии 1.9a. Значение цвета 'auto', по-видимому, дебютирует в этом выпуске. Это хорошее дополнение, потому что названия ветвей получат другой цвет. Это облегчает различие между локальной и удаленной ветвями, например.

gospes
источник
fatal: bad color value 'auto' for variable '--pretty format':(
Поворот
Оказалось, что это старая версия git. В репозитории Yum есть довольно устаревшая версия Git. Скомпилирован из источника (1.9), и он прекрасно работает. Это тоже красиво! Спасибо @gospes!
Поворот
Не идти на OS X:sed: illegal option -- r
Слипп Д. Томпсон
@ SlippD.Thompson: я использую Linux :). -R для расширенных регулярных выражений. По-видимому, у OSX-версии sed ее нет. Возможно, вы могли бы обновить sed. В противном случае вы можете просто переписать команду sed без расширенного регулярного выражения.
Госпс
1
Для Mac OS X sed используйте -E вместо -r
Бакстер Лопес
37

Зависит от того, как они выглядели. Я использую gitx, который делает такие картинки:

простой сюжет

Вы можете сравнить git log --graphс gitk в слиянии осьминога с 24 путями (первоначально от http://clojure-log.n01se.net/date/2008-12-24.html ):

24-ходовой мерзавец осьминога сливается.  Исходный URL был <code> http://lwn.net/images/ns/kernel/gitk-octopus.png </ code>

Dustin
источник
49
Забавно ... Я бы поклялся, что слышал, как ты говоришь "Слияние осьминога с 24 путями"!
DTY
4
Из любопытства кто-нибудь пытался извлечь GitX (или другой инструмент git с графическим интерфейсом) в автономный исполняемый файл? Если я не ошибаюсь, заставить Какао рисовать в векторный файл PDF не составит труда, и он удовлетворит потребность ОП в печатных изображениях высокого качества.
Слипп Д. Томпсон
Это было на S3 через skitch, прежде чем они переделали свою вещь. Я бы хотел, чтобы это все еще было. :(
Дастин
Просто заменили его на версию gitk от lwn.net/images/ns/kernel/gitk-octopus.png , связанную с clojure-log.n01se.net/date/2008-12-24.html . @ Дастин: надеюсь, что все в порядке. Это не то же самое изображение, но оно служит аналогичной цели. На снимке экрана это выглядит так, как будто это часть ядра Linux, так что я думаю, вы могли бы найти этот коммит и повторно взять эквивалентный скриншот gitx ....
naught101
34

Для более подробного текстового вывода, пожалуйста, попробуйте:

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
Kaoru
источник
29

Это мое мнение по этому вопросу:

Скриншот:

Скриншот

Применение:

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)'"
drzymala
источник
28

gitg : средство просмотра репозитория на основе gtk, это новое, но интересное и полезное
http://git.gnome.org/browse/gitg
Я использую его в настоящее время

saeedgnu
источник
2
Кажется, это клон, GitXи довольно хороший. Рекомендую
Yarek T
28

Хотя иногда я использую 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 

Как вы можете видеть, это почти клавиатурные псевдонимы, основанные на:

  • --цвет: чистый вид
  • --graph: визуализировать родителей
  • --date-order: самый понятный взгляд на репо
  • - украшать: кто есть кто
  • --oneline: много раз все, что вам нужно знать о коммите
  • --simplify-by-украшения: базовый для первого взгляда (только теги, соответствующие слияния, ветви)
  • --all: сохранение нажатий клавиш со всеми псевдонимами с и без этой опции
  • --date = относительный (% ar): Понимать активность в репо (иногда ветка - это всего лишь несколько коммитов рядом с мастером, но месяцы назад от него)

Смотрите в последней версии git (1.8.5 и выше) вы можете воспользоваться% C (авто) в декорации заполнителя% d

Отсюда все, что вам нужно, это хорошее понимание gitrevisions для фильтрации всего, что вам нужно (что-то вроде master..develop, где --simplify-merges может помочь с долгосрочными ветвями)

Мощь командной строки - это быстрое конфигурирование, основанное на ваших потребностях (понимайте, что репозиторий не является уникальной конфигурацией журнала ключей, поэтому иногда необходимо добавить --numstat, или --raw, или --name-status. Здесь git log и псевдонимы быстрые, мощные и (со временем) самый красивый график, который вы можете достичь. Более того, с выводом по умолчанию через пейджер (скажем, меньше) вы всегда можете быстро искать в результатах. Не уверен? Вы всегда можете проанализировать результат с такими проектами, как gitgraph

albfan
источник
Очень хорошо. Добавив их в мой конфиг. Но я рекомендую изменить% Cred% d% Creset на% C (auto)% d% Creset, который даст разные цвета для имен удаленных или локальных ветвей
MarkB42
17

Слегка подправив удивительный ответ Слиппа , вы можете использовать его псевдонимы, чтобы регистрировать только одну ветку:

[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
Петр Айтай
источник
15

Я предлагаю tig https://github.com/jonas/tig , намного лучший инструмент командной строки для git.

Вы можете использовать homebrew для установки TIG на MacOS:

$ brew install tig
$ tig

введите описание изображения здесь

nodejh
источник
14

У меня есть этот 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 .

Евгений Ярмаш
источник
1
git log --graph --oneline просто чтобы убедиться, что он не потерян
ценапатия
Есть ли способ поставить имена филиалов на левой стороне?
Anaval
12

Ты пробовал gitkили gitk --all? Однако он не имеет функции печати / сохранения в качестве функции.

Адриан Панасюк
источник
3
Гитк эффективен, но не очень красив.
Йохан
Тот факт, что он встроен, делает его приятным и удобным для меня. Особенно --allпоказывает вам все ветви.
BcK
12

GitGraph

Создает представление PNG или SVG истории коммитов вашего репозитория Git.

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

EddieG098
источник
@AndyHayden: это не так. Абсолютно другой. Создает граф истории
мерзавцев,
11
git -c core.pager='less -SRF' log --oneline --graph --decorate

Это мой окончательный вариант, похожий на многие ответы здесь. Мне нравится корректировать передаваемые флаги, lessчтобы предотвратить перенос слов.

пример вывода

Я установил псевдоним для быстрого доступа, так как команда немного громоздка.

Энди
источник
8

Попробуйте Дитаа . Он может преобразовать любую диаграмму ASCII в изображение. Хотя он не был разработан с учетом веток Git, я был впечатлен результатами.

Источник (текстовый файл):

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

Команда:

java -jar ditaa0_9.jar ascii-graph.txt

Результат:

введите описание изображения здесь

Он также поддерживает цвета фона, пунктирные линии, различные формы и многое другое. Смотрите примеры .

fracz
источник
1
В том же духе casual-effects.com/markdeep очень силен, чтобы привести в порядок составленные вручную графики ascii.
Бени Чернявский-Паскин
7

Если ваш репозиторий находится на Gitlab, вы можете использовать его графическое представление, так как оно отображается в вашем браузере как SVG.

  • Перейдите к графическому представлению вашего хранилища, например, https://gitlab.com/gitlab-org/gitter/webapp/network/develop.

  • Прокрутите график вниз до дна (это ленивые загрузки фиксирует!)

  • Используйте инспектор вашего браузера, чтобы скопировать элемент SVG в новый файл

  • Откройте его в выбранном вами рендерере, например Inkscape

введите описание изображения здесь

bugmenot123
источник
6

Я не знаю о прямом инструменте, но, возможно, вы можете взломать скрипт, чтобы экспортировать данные в точечный формат и визуализировать его с помощью Graphviz.

Томас
источник
Попробуйте это github.com/gugod/bin/blob/master/git-graphviz . У меня не было всех зависимостей в моей корпоративной среде, поэтому изменение этих ioкоманд на простые команды perl `git log [...]` работало для меня.
Росс Роджерс
Если вы работаете на Mac и хотите попробовать этот скрипт, вы можете взять perl brew install perl dotи затем cpan common::sense IO::allполучить зависимости. Затем просто передайте вывод соответствующей команде, например git-graphviz | dot -Tpng -o repo.png. Однако вывод не сильно отличается от git-big-picture .
jrhorn424
6

В качестве одной из демоверсий библиотеки веб-графики Raphael есть забавный граф коммитов Git .

Демонстрация является статической, но должно быть достаточно просто взять код и обменять их статические данные на живой набор данных - я думаю, что это просто данные Git commit в формате JSON.

Демоверсия здесь: http://dmitrybaranovskiy.github.io/raphael/github/impact.html

Spudley
источник
1
Это тот же самый код, который используется на графах влияния GitHub, не так ли? (например, github.com/DmitryBaranovskiy/raphael/graphs/impact )
Слипп Д. Томпсон
@Sven: Спасибо, что указали на это. Я исправил для вас неработающие ссылки, хотя имейте в виду, что этому ответу пять лет, и поэтому может появиться лучшее решение в последнее время.
Спадли
@ SlippD.Thompson этот код теперь находится на github.com/DmitryBaranovskiy/raphaeljs.com/tree/master/github
Вадим Котов
6

Хороший и чистый вид табличного git-графика для оболочек

с хэшами, как обычно, помимо дерева графов

с хэшами, как обычно, помимо дерева графов

или в дополнительном столбце

или в дополнительном столбце

Изменить : Вы хотите начать прямо сейчас, не читая объяснения? Используйте псевдонимы git, скрипты или фрагменты кода функций из раздела EDIT 5 ниже или даже самый удобный способ с EDIT 6 .

Во всех ответах на этот вопрос ни один из них не показал чистого табличного вида для оболочек. Наиболее близким был этот ответ от господа, откуда я начал.

Суть моего подхода заключается в подсчете только тех символов дерева, которые показаны пользователю. Затем заполните их до личной длины пробелами.

Кроме мерзавца вам нужны эти инструменты

  • Grep
  • вставить
  • Printf
  • СЭД
  • сл
  • тр
  • Туалет

в основном на борту с любым дистрибутивом 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 Bracket Auto цвет головы и тег табличного вывода оболочки

Измените эту часть команды git (цвет 214 )

%C(214)%>(15,trunc)%D%C(reset)

к авто

%C(auto)%>(15,trunc)%D%C(reset)


РЕДАКТИРОВАТЬ 4 : Или вам нравится ваша собственная цветовая смесь для этой части, причудливый вывод с мигающей головой?

Git Tree Необычные стили в виде таблицы

Чтобы иметь возможность сначала стилизовать заголовок, имена веток и теги, нам нужна опция «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

fanciest_git_tree_tablelike_image

Слишком много миганий! Просто чтобы продемонстрировать, что это возможно. Слишком мало указанных цветов приводит к повторению цветов.

Полная ссылка .gitconfig находится всего в одном клике.


РЕДАКТИРОВАТЬ 6 : Из-за ваших положительных голосов я улучшил фрагмент. Теперь вы можете передать его практически любой командой git log и больше не нужно адаптировать код. Попробуй это!

Как это работает?

  • определите свои команды git log в вашем .gitconfig как всегда
  • определить положительный номер столбца дерева (необязательно), где отображается граф git

Тогда просто позвони

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
  • используйте опцию --color для цветного вывода

Теперь улучшенный фрагмент для вашего .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 на лету

введите описание изображения здесь

ОПЯТЬ: весело проведите время, чтобы оформить свой собственный чистый, похожий на стол вывод для своих нужд.

еще один вопрос
источник
В своем ответе вы должны объяснить, как эти фрагменты bash превратятся в необычные команды, подобные git log. Можно понять, пользуясь просмотром связанного с вами ответа, но ответы должны быть автономными
Андрас Дик
Вы имеете в виду, что я должен подробно объяснить git log cmd? Или не могли бы вы дать мне пример того, что вам не хватает, пожалуйста.
onemorequestion
Примечание. Вывод команды awesome git log используется этим фрагментом для получения табличного вывода на терминале. Итак, наоборот, как вы упомянули;)
вопрос
Я подумал, что вы не вводите 20 строк bash каждый раз, когда вам это нужно. Имеет смысл определить это как функцию bash или псевдоним git. Большинство читателей не будут пытаться завершить ваш код, чтобы его было легко использовать. Это то, что я имел в виду. Если вы просто поместите код в случайный файл sh на вашем пути, вы можете игнорировать меня.
Андрас Дик
1
Понимаю. Спасибо за ваш совет. Я отредактирую свой ответ и добавлю такой псевдоним. Обычно я использую файлы для таких «длинных» команд, как вы упомянули. Но я согласен, что писать обоими способами гораздо удобнее.
вопрос
5

некоторые псевдонимы в ~ / .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'
shuaihanhungry
источник
4

Для пользователей 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 не работает.

markeissler
источник