Я автор GitX . Одна из особенностей GitX - это визуализация веток, как можно увидеть здесь .
Эта визуализация в настоящее время выполняется путем чтения коммитов, которые генерируются из git в правильном порядке. Для каждого коммита родители известны, поэтому довольно просто правильно построить дорожки.
Я бы хотел ускорить этот процесс, используя мой собственный пул коммитов и линеаризуя коммиты самостоятельно. Это позволяет мне повторно использовать существующие загруженные коммиты и позволяет git быстрее отправлять коммиты, потому что он не должен отправлять их в правильном порядке.
Однако я не уверен, какой алгоритм использовать для этого. Важно, чтобы здание было инкрементным, поскольку загрузка коммитов может занять много времени (> 5 секунд на 100 000 коммитов, которые должны отображаться все).
Gitk пошел по тому же пути, и здесь есть патч здесь , который показывает, как он реализован, но мои навыки TCL слабы, и патч не очень тщательно прокомментирован и немного труден для исполнения.
Я бы также хотел, чтобы этот алгоритм был эффективным, поскольку он должен обрабатывать сотни тысяч коммитов. Он также должен отображаться в таблице, поэтому важно, чтобы доступ к определенным строкам был быстрым.
Я опишу данные, которые у меня есть, вывод, который я хочу, и несколько наблюдений.
Введите:
- У меня есть текущий пул коммитов в форме хеш-таблицы, которая отображает идентификаторы коммитов для фиксации объектов. Этот пул не должен быть полным (иметь все необходимые коммиты)
- У меня отдельная загрузка потоков в новых коммитах из git с обратным вызовом, который можно вызывать каждый раз при загрузке нового коммита. Не существует гарантированного порядка поступления коммитов, но в большинстве случаев следующий коммит является родителем предыдущего коммита.
- У объекта коммита есть собственный идентификатор ревизии и идентификаторы ревизии всех его родителей
- У меня есть список руководителей ветвей, которые должны быть перечислены. То есть, нет ни одной «вершины» DAG, которая должна отображаться. Также не обязательно должен быть один корень графа.
Выход:
- Мне нужно будет линеаризовать эти коммиты в топологическом порядке. То есть, коммит не может быть указан после того, как были перечислены его родители.
- Мне также нужны «ветки», которые можно увидеть на скриншоте выше. Это, вероятно, необходимо предварительно вычислить, так как большинство из них зависят от своих детей.
Несколько замечаний:
- Необходимо переместить список коммитов. Например, нам может потребоваться коммиты (главы веток), которые не связаны, пока не появится коммит, который делает одну голову предком другой.
- Должно быть показано несколько подсказок для ветвей
- Важно, чтобы этот процесс был инкрементным, чтобы по крайней мере частичное представление было доступно, пока данные все еще загружаются. Это означает, что новые данные должны быть вставлены на полпути, и что ответвительные линии должны быть перенастроены.