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