一些背景:
我正在研究使用 Git 作为数据存储层的可能性。基本上我需要保留一些描述应用程序状态的 XML 文件的所有版本。用户需要一个“时间机器”才能恢复到以前的状态,以及从以前的状态分支等。这将 stash 在服务层后面,但我正在考虑在后端使用 Git。
我需要展示应用程序状态随时间的演变,所以我想构建一个网络图来显示变化、分支等。
为此,我需要直观地构建一个版本树。基本上,我想这样做:
git log --oneline --graph --decorate --all
我正在使用 LibGit2Sharp。我仔细研究了 API,但没有发现任何立即有用的信息。我对 Git 也很了解,但这并没有帮助。
最佳答案
使用 LibGit2Sharp,您可以通过枚举 Commits
来模拟 git log
命令。您还可以过滤提交列表,或指定一些排序选项(例如让列表按拓扑顺序排序)。可以在 LibGit2Sharp wiki page 上找到更多信息。与 git log
相关。
使用像 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、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");
关于git - 如何使用 LibGit2(Sharp) 为 Git 存储库构建版本树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15203844/