我是 GitX 的作者。 GitX 的特性之一是分支的可视化,如 here 所示。
这种可视化目前是通过读取以正确顺序从 git 发出的提交来完成的。对于每次提交, parent 都是已知的,因此以正确的方式建立 channel 相当容易。
我想通过使用我自己的提交池并自己线性化提交来加速这个过程。这允许我重用现有的已加载提交并允许 git 更快地发出提交,因为它不必以正确的顺序发出它们。
但是,我不确定使用什么算法来实现这一点。构建是增量的很重要,因为提交的加载可能需要很长时间(对于 100,000 次提交,> 5 秒,应该全部显示)。
Gitk 也是这样,有一个补丁 here 显示了它是如何实现的,但是我的 TCL 技能很弱,补丁没有很彻底的评论,有点难以理解。
我还希望这个算法高效,因为它必须处理数十万次提交。它也必须显示在表格中,因此快速访问特定行很重要。
我将描述到目前为止的输入、我想要的输出和一些观察结果。
输入:
输出:
几点说明:
最佳答案
标准的 topological sort 是 O(n)(OK,O(V+E)),也就是说,您应该能够在几分之一秒内对内存中的一百万次提交进行排序。不需要像 Tcl 那样的增量 hack。
顺便说一句,我每天都使用 GitX(在 OS X 上看起来比 Gitk 好得多)并且没有任何问题(可能是因为我的存储库中没有那些疯狂的 merge ):)
关于objective-c - git DAG 的增量线性化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/701439/