3

一些背景:

我正在研究使用 Git 作为数据存储层的可能性。基本上我需要保留一些描述应用程序状态的 XML 文件的所有版本。用户需要一个“时间机器”才能恢复到以前的状态,以及分支以前的状态等。这将隐藏在服务层后面,但我正在考虑在后端使用 Git。

我需要展示应用程序状态随时间的演变,所以我想构建一个网络图来显示变化、分支等。

为此,我需要直观地构建版本树。基本上,我想这样做:

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

我正在使用 LibGit2Sharp。我已经浏览了 API,但没有立即看到任何有用的东西。我对 Git 也很了解,但这并没有帮助。

4

2 回答 2

4

使用 LibGit2Sharp,您可以git log仅通过枚举Commits. 您还可以过滤提交列表,或指定一些排序选项(例如让列表按拓扑顺序排序)。更多信息可以在与git log.

使用像QuickGraph这样的图形库(但还有其他的,可以在 this other SO question中找到),您可以像这样构建图形:

var graph = new AdjacencyGraph<Commit, Edge<Commit>>();

using (var repo = new Repository(path_to_your_repo))
{
    foreach (var c in repo.Commits.Take(20))
    {
        graph.AddVerticesAndEdgeRange(c.Parents.Select(p => new Edge<Commit>(c, p)));
    }
}

然后,您可以将此图输出为多种可视化格式(graphML、Glee、graphviz)。以 graphviz (.dot) 格式输出:

var graphviz = new GraphvizAlgorithm<Commit,Edge<Commit>>(graph);
graphviz.FormatVertex +=
    (o, e) =>
        {
            e.VertexFormatter.Label = string.Format("{0} {1}", e.Vertex.Id.ToString(7),
                                                    e.Vertex.MessageShort.Replace("\"", "\\\""));
        };

graphviz.Generate(new FileDotEngine(), @"d:\graph");
于 2013-03-05T13:50:46.127 回答
1

libgit2是关于底层 Git 概念的。如果要显示图表,则需要查看提交以及它们之间的关系。然后,您可以使用您喜欢的任何图形库绘制图形。

如果您想要的是该命令的输出,那么运行该命令是最简单的方法。

于 2013-03-05T13:31:27.327 回答