程会玩 | 在.NET Core里操作Git

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

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就势在必行了。

640?wx_fmt=gif

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

640?wx_fmt=gif

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

640?wx_fmt=png

由于它实现了 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);

    }

}

640?wx_fmt=png

当然,除了分支的名称,还包括该分支底下的Commits等其他信息。

640?wx_fmt=png

检索 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}");

}

640?wx_fmt=png

要查找具体某一个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()}");

640?wx_fmt=png

想要获取最新的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()}");

640?wx_fmt=png

检索 Tags

和Branch类似,标签信息可以通过Repository.Tags属性得到:

foreach (var item in repo.Tags)

{

    Console.WriteLine($"{item.FriendlyName} - {item.Target.Id}");

}

640?wx_fmt=png

其他操作

以上例子演示了最常用的Git仓库信息检索操作,还有很多其他操作,如通过Repository.Ignore读写忽略文件,写入Commit、对比更改等,本文就不再一一赘述啦,大家可以自己探索~

640?wx_fmt=gif

参考:http://www.woodwardweb.com/git/getting_started_2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Knowledge Test about Match

Knowledge Test about Match 题意&#xff1a; 给你一个B数组&#xff0c;要求你去匹配A数组[0&#xff0c;N-1]&#xff0c;计算公式f(a,b)∑i0n−1∣ai−bi∣f(a,b)\sum_{i0}^{n-1}\sqrt{|a_{i}-b_{i}|}f(a,b)∑i0n−1​∣ai​−bi​∣​,使得结果尽量小。最终结果与标准结…

一个实时收集MySql变更记录的组件CanalSharp.AspNetCore

一、关于CanalSharpCanalSharp 是阿里巴巴开源项目 Canal 的 .NET 客户端。为 .NET 开发者提供一个更友好的使用 Canal 的方式。Canal 是mysql数据库binlog的增量订阅&消费组件。CanalSharp 是 Canal 的 .NET 客户端&#xff0c;它与 Canal 是采用的Socket来进行通信的&…

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 题号题目知识点ASimply Strange Sort暴力BCharmed by the GameCDeep Down BelowD1Up the Strip (simplified version)D2Up the StripEBottom-Tier ReversalsFTop-Notch Insertions A 直接暴力就行&am…

[Abp vNext 源码分析] - 1. 框架启动流程分析

一、简要说明本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程&#xff0c;让大家了解整个 Abp vNext 框架是如何运作的。总的来说 &#xff0c;Abp vNext 比起 ABP 框架更加精简。因为在 vNext 版本当中&#xff0c;原来归属于 Abp 库的许多内置的基本组件 (组织…

cf1561B. Charmed by the Game

cf1561B. Charmed by the Game 题意&#xff1a; 两人轮流发球&#xff0c;有两种得分的情况&#xff0c;一个是自己发球的回合得分&#xff0c;叫做"holds"&#xff0c;另一种是在对方发球的回合得分&#xff0c;叫做"breaks"&#xff0c;现在给出比赛结…

使用 MSIX 打包 DotNetCore 3.0 客户端程序

如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来&#xff0c;不被轻易反编译的话&#xff0c;那么这篇文章应该能帮到你。介绍MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打包解决方案。其目的是取代旧式的软件打包方式&#xff0c;可用于 Win32、W…

cf1561C. Deep Down Below

cf1561C. Deep Down Below 题意&#xff1a; 有个英雄&#xff0c;英雄有自己的力量值&#xff0c;有n个洞穴&#xff0c;每个洞穴有ki个怪物&#xff0c;每个怪物有自己的血量&#xff0c;当你力量值大于怪物血量&#xff0c;你就杀死他&#xff0c;否则你就失败&#xff0c…

使用 C# 和 Blazor 进行全栈开发

Blazor 是将 C# 引入浏览器的 Microsoft 试验框架&#xff0c;正好可以填补欠缺的 C# 一环。如今&#xff0c;C# 程序员可以编写桌面、服务器端 Web、云、电话、平板电脑、手表、电视和 IoT 应用程序。Blazor 填补了欠缺的一环&#xff0c;C# 开发人员现在可以直接在用户浏览器…

AWS vs K8s 是新的 Windows vs Linux

作者&#xff1a;Ian Miell是开源程序员、演讲师、作家和博客写手以前……如果你与我一样&#xff0c;年过四十&#xff0c;又在IT行业工作&#xff0c;恐怕还记得每个人使用Windows&#xff0c;一小群但越来越多的人在业余时间埋头编译Linux的年代。Windows用户见此情形会困惑…

cf1561D Up the Strip(D1D2)

cf1561D Up the Strip(D1&&D2) 题意&#xff1a; 一个长度为n的赛道&#xff0c;一开始在n的位置&#xff0c;你要前往到1&#xff0c;每次移动你有两种方式&#xff1a; 在1和x-1之间选择一个整数y&#xff0c;并从位置x移动到位置x-y在2和x之间选择一个整数z&…

Asp.Net Core中的静态文件-12

目录本文出自《从零开始学 ASP.NET CORE MVC》目录 推荐文章&#xff1a;配置 ASP.NET Core 请求(Request)处理管道Asp.Net Core 中的静态文件在这个视频中我们将讨论如何使 ASP.NET Core 应用程序&#xff0c;支持静态文件&#xff0c;如 HTML&#xff0c;图像&#xff0c;CSS…

2018 ICPC Asia Jakarta Regional Contest

2018 ICPC Asia Jakarta Regional Contest 题号题目知识点难度AEdit DistanceBRotating GearCSmart ThiefDIcy LandEArtilleries and Defensive WallsFPopping BalloonsGGo Make It CompleteHLexical Sign SequenceILie DetectorJFuture GenerationKBoomerangsLBinary String

在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发

在.net core开发过程中&#xff0c;使用最多的就是注入方法。但是在.net core使用PetaPoco时&#xff0c;PetaPoco还不支持进行注入方式进行处理一些问题。今天对PetaPoco进行了一些扩展&#xff0c;可以很方便的将PetaPoco进行注入操作&#xff0c;使用和EF很相似&#xff0c;…

F-Pairwise Modulo

d数组是来算&#xff08;x整除y&#xff09;*y中y比x小的数 s数组是算&#xff08;x整除y&#xff09;*y中y比x大的数 &#xff08;x整除y&#xff09;*y 看x对于前面大于他的数是枚举&#xff0c;对于前面小于他的数是d树状数组储存。 d中 x整除y表示x中有多少个y 所以 …

2020 ICPC NAC

2020 ICPC NAC 题号题目知识点难度AAnother Coin Weighing PuzzleBMini BattleshipCBomasDAll KillEGrid GuardianFHopscotch 50GICPC CampHLetter WheelsIEditing ExplosionJLunchtime Name RecallKRooted SubtreesLTomb Raider

【微服务学习】Polly:熔断降级组件

何为熔断降级“熔断器如同电力过载保护器。它可以实现快速失败&#xff0c;如果它在一段时间内侦测到许多类似的错误&#xff0c;会强迫其以后的多个调用快速失败&#xff0c;不再访问远程服务器&#xff0c;从而防止应用程序不断地尝试执行可能会失败的操作&#xff0c;使得应…

A - Junk-Mail Filter HDU - 2473

只是这样合并&#xff0c;分割点的时候就不能分了。 这样合并再加上虚拟节点&#xff0c;那么每个你要求的节点就的下面就不连其他节点了&#xff0c;这样就可以进行删除操作了 #include<iostream> #include<algorithm> #include<cstdio> #include<cstr…

为什么不要使用 async void

问题在使用 Abp 框架的后台作业时&#xff0c;当后台作业抛出异常&#xff0c;会导致整个程序崩溃。在 Abp 框架的底层执行后台作业的时候&#xff0c;有 try/catch 语句块用来捕获后台任务执行时的异常&#xff0c;但是在这里没有生效。原始代码如下&#xff1a;public class …

2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)

2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018) 题号题目知识点难度AAccess PointsBBrexit NegotiationsCCircuit Board DesignDDate PickupEEquality ControlFFastest SpeedrunGGame DesignHHard DriveIInflationJJinxed BettingKKleptogr…

LCA。。。

树链剖分 #include<cstdio> #include<iostream> #include<cstring> using namespace std; const int N5e510;int h[N],e[2*N],ne[2*N],idx0; void add(int u,int v){e[idx]v,ne[idx]h[u],h[u]idx;return;}int siz[N],de[N],son[N],top[N],fa[N],id[N],num; …