我是GitX的作者。 GitX的一个功能是分支的可视化,可以看到here。
此可视化目前通过读取以正确顺序从git发出的提交来完成。对于每次提交,父母都是已知的,因此以正确的方式构建通道相当容易。
我想通过使用自己的提交池并自行线性化提交来加快此过程。这允许我重用现有的已加载提交并允许git更快地发出提交,因为它不必以正确的顺序发出它们。
但是,我不确定使用什么算法来完成此任务。重要的是建筑物是增量的,因为提交的加载可能需要很长时间(100,000次提交的时间> 5秒,应该全部显示)。
Gitk已经走了同样的道路,并且有一个补丁here,展示了它是如何实现的,但是我的TCL技能很弱,并且补丁没有得到很好的评论,也有点难以理解。
我也希望这个算法高效,因为它必须处理数十万次提交。它也必须显示在表中,因此访问特定行很快很重要。
我将描述我到目前为止的输入,我想要的输出和一些观察。
输入:
输出:
一些评论:
答案 0 :(得分:6)
标准topological sort是O(n)(OK,O(V + E)),即你应该能够在几分之一秒内对内存中的一百万次提交进行排序。不需要像Tcl那样的增量黑客。
顺便说一句,我每天都使用GitX(看起来比OS X上的Gitk要好得多)并且没有任何问题(也许是因为我在我的存储库中没有那些疯狂的合并):))答案 1 :(得分:3)
好的,所以我也有同样的困难时间阅读整个补丁,但是让我们看看我是否可以从我所弄清楚的东西中把它拼凑起来。
首先,gitk通过将一串提交压缩为一个弧来简化事物,其中包含一系列提交,每个提交只有一个父项和一个子项。除此之外,这样做可以大大减少您必须考虑的排序节点数量,这将有助于您使用的任何算法。作为奖励,相关提交将最终组合在一起。
在读取新提交时,这确实会在查找弧时引入一些复杂性。有几种情况:
您可能希望在弧中包含多子或多父提交,或者将它们分开可能更有意义。无论哪种方式,逐步建立这组弧都不应该太难。
一旦你有了这些弧线,你仍然会尝试线性化它们。在您的情况下,上述Wikipedia page中描述的第一个算法听起来很有用,因为您有一组已知的分支点用作初始集合S.
其他说明:
无论如何,我希望有所帮助。至少在思考这个问题时很有意思。
答案 2 :(得分:0)
你真的需要一次显示100k提交吗?什么样的用户可以吸收这种信息?
您是否考虑过分页?我只计算~100次提交或其他东西。如果分支线返回(离页),你可以使用类似Github的后向箭头来显示。
答案 3 :(得分:-2)
我没有使用GitX,所以也许我错过了一些东西,但似乎你可以从每个当前分支的头部从孩子走到父母,直到你可以画出几个图形的屏幕。
这可能无法为您提供以前根植的分支的最佳视觉布局。但似乎响应性比等待绘制最少交叉的图表更重要,因为大多数用户可能对最近的活动感兴趣。