2013-03-04 66 views
3

一些背景资料:如何建立一个版本树使用LibGit2(夏普)一个Git仓库

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

我需要提交应用程序的状态随着时间的演变,所以我想打造出变化的网络图,树枝等

要做到这一点,我需要在视觉上建立一个版本树。基本上,我想这样做:

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

我正在使用LibGit2Sharp。我围绕API进行了探讨,但是我没有看到任何直接有用的东西。我对Git也很了解,这对我没有帮助。

+0

这更是一个数据可视化的问题,看的图形可视化的.NET库(git的历史是一个直接的无环图) – CharlesB 2013-03-05 10:24:30

回答

1

libgit2是关于底层的Git概念。如果你想显示一个图表,你需要看看提交以及它们如何相互关联。然后,您可以绘制您喜欢的任何图形库的图形。

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

3

使用LibGit2Sharp,只需通过枚举Commits即可模拟git log命令。你也可以过滤提交列表,或者指定一些排序选项(比如让列表按照拓扑顺序排序)。更多信息可以在与git log相关的LibGit2Sharp wiki page上找到。

使用像QuickGraph的图形库(当然还有其他,如可以在这个其他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,graphwiz)。要在graphwiz(.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"); 
相关问题