点击上方蓝字关注“汪宇杰博客”
Git是很多程序员的首选源代码版本控制工具,我最近也从TFVC切换到了Git,受益匪浅。今天我就来带大家看看如何在.NET Core里操作Git。
为啥要这么做
首先,这件事情的意义,并不是闲的蛋疼。我们确实有很多不错的Git客户端,如GitHub for Windows、VS/VS Code,Git GUI等,都相当成熟,没有必要自己再去用.NET/C#重新发明轮子。但在服务器上,可能你需要管理一个Git仓库,有自己的业务逻辑,Git仓库需要和其他系统流程整合,甚至想用ASP.NET写一个自己的GitHub出来,那么用.NET Core来操作Git就势在必行了。
LibGit2Sharp
我们不需要从零开始研究Git的原理,强大的.NET社区已经有了一个操作Git的库:LibGit2Sharp。它同时支持.NET Framework及.NET Core,我们需要用的就是它!
传送门:https://github.com/libgit2/libgit2sharp
这个库也能在NuGet上直接安装:
https://www.nuget.org/packages/LibGit2Sharp
首先,我们将它引入.NET Core工程
NuGet Package Manager (Visual Studio)
Install-Package LibGit2Sharp
.NET Core CLI
dotnet add package LibGit2Sharp
Clone 远程仓库
Repository.Clone() 方法可以拉取一个远程仓库到本地,等同于 git clone 命令。
Repository.Clone("https://github.com/EdiWang/EnvSetup.git", @"D:\EnvSetup");
创建本地仓库
Repository.Init() 方法可以在指定路径创建一个新的Git仓库,等同于 git init 命令。
Repository.Init(@"D:\GitRocks");
打开本地Git仓库
LibGit2Sharp.Repository 类型代表一个Git仓库,它可以只在内存中,也可以从一个本地路径加载,即包含".git"文件夹的目录。如我的博客项目 D:\GitHub\Moonglade
由于它实现了 IDisposable 接口,所以推荐使用using语句把对Repository的操作包装起来,以便于释放资源。
打开本地Git仓库很简单,将路径传给Repository的构造函数,就搞定了:
using (var repo = new Repository(@"D:\GitHub\Moonglade"))
{
}
检索 Branch
Repository.Branches 属性包含了当前仓库所有的分支信息。比如,我们要输出当前仓库有哪些本地和远程branch,就可以这么做:
using (var repo = new Repository(@"D:\GitHub\Moonglade"))
{
var branches = repo.Branches;
foreach (var b in branches)
{
Console.WriteLine(b.FriendlyName);
}
}
当然,除了分支的名称,还包括该分支底下的Commits等其他信息。
检索 Commits
通过遍历Branch.Commits,或Repository.Commits,可以获得完整的Commits历史记录信息:
foreach (var commit in repo.Commits)
{
Console.WriteLine(
$"{commit.Id.ToString().Substring(0, 7)} " +
$"{commit.Author.When.ToLocalTime()} " +
$"{commit.MessageShort} " +
$"{commit.Author.Name}");
}
要查找具体某一个Commit,可以使用Repository.Lookup<Commit>()方法:
var commit = repo.Lookup<Commit>("9fddbbf");
Console.WriteLine($"Commit Full ID: {commit.Id}");
Console.WriteLine($"Message: {commit.MessageShort}");
Console.WriteLine($"Author: {commit.Author.Name}");
Console.WriteLine($"Time: {commit.Author.When.ToLocalTime()}");
想要获取最新的Commit,访问Repository.Head.Tip即可。
var commit = repo.Head.Tip;
Console.WriteLine($"Commit Full ID: {commit.Id}");
Console.WriteLine($"Message: {commit.MessageShort}");
Console.WriteLine($"Author: {commit.Author.Name}");
Console.WriteLine($"Time: {commit.Author.When.ToLocalTime()}");
检索 Tags
和Branch类似,标签信息可以通过Repository.Tags属性得到:
foreach (var item in repo.Tags)
{
Console.WriteLine($"{item.FriendlyName} - {item.Target.Id}");
}
其他操作
以上例子演示了最常用的Git仓库信息检索操作,还有很多其他操作,如通过Repository.Ignore读写忽略文件,写入Commit、对比更改等,本文就不再一一赘述啦,大家可以自己探索~
参考:http://www.woodwardweb.com/git/getting_started_2.html