.NET Core下操作Git,自動提交代碼到 GitHub

来源:https://www.cnblogs.com/meowv/archive/2019/08/21/11389175.html
-Advertisement-
Play Games

.NET Core 3.0 預覽版發佈已經好些時日了,博客園也已將其用於生產環境中,可見 .NET Core 日趨成熟 回歸正題,你想蓋大樓嗎?想 GitHub 首頁一片綠嗎?今天拿她玩玩自動提交代碼至 GitHub。 安裝項目模板 創建項目 直接使用 .NET CLI 創建一個 Work Serv ...


.NET Core 3.0 預覽版發佈已經好些時日了,博客園也已將其用於生產環境中,可見 .NET Core 日趨成熟

回歸正題,你想蓋大樓嗎?想 GitHub 首頁一片綠嗎?今天拿她玩玩自動提交代碼至 GitHub。

安裝項目模板

dotnet new --install "Microsoft.DotNet.Web.ProjectTemplates.3.0"
dotnet new worker

創建項目

直接使用 .NET CLI 創建一個 Work Service 的項目

dotnet new worker -o AutomaticPush

用 Visual Studio 2019 打開項目可以看到以下代碼

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}
  • 從 3.0 起 WebHost 被 Host 取代了
  • CreateHostBuilder創建 Host 併在ConfigureServices中調用.AddHostedService<Worker>()
// Worker.cs
public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

Worker 繼承了 BackgroundService,在 override ExecuteAsync 方法中完成自動提交的代碼

.NET 下操作 Git 需要用到一個庫 LibGit2Sharp,同時支持 .NET Framework 及 .NET Core

在項目中安裝使用

Install-Package LibGit2Sharp

LibGit2Sharp 簡單使用

  • Repository.Init(@"D:\Work") 在指定路徑創建一個新的 Git 倉庫,相當於 git init

  • Repository.Clone("https://github.com/Meowv/Blog.git", @"D:\Work") 拉取一個遠程倉庫到本地,相當於 git clone

  • using (var repo = new Repository(@"D:\Blog")){} 打開本地存在的 Git 倉庫

  • 獲取 Branch

    using (var repo = new Repository(@"D:\Blog"))
    {
        var branches = repo.Branches;
    
        foreach (var item in branches)
        {
        }
    }
  • 獲取 Commits

    using (var repo = new Repository(@"D:\Blog"))
    {
        foreach (var commit in repo.Commits)
        {
        }
    }
  • 獲取 Tags

    using (var repo = new Repository(@"D:\Blog"))
    {
        foreach (var commit in repo.Tags)
        {
        }
    }
  • 更多操作請移步 https://github.com/libgit2/libgit2sharp

自動 Push 代碼蓋大樓

有了以上基礎,就可以實現自動生成文件,push 代碼到 GitHub 了。

新建一個配置文件,存放我們 GitHub 倉庫以及賬號密碼等重要信息

{
  "repository": "本地git倉庫絕對路徑",
  "username": "GitHub賬號",
  "password": "GitHub密碼",
  "name": "提交人",
  "email": "郵箱"
}

在ExecuteAsync中讀取配置文件信息

var configurationRoot = new ConfigurationBuilder().AddJsonFile("config.json").Build();

var path = configurationRoot["repository"];
var username = configurationRoot["username"];
var password = configurationRoot["password"];
var name = configurationRoot["name"];
var email = configurationRoot["email"];

git會自動檢測文件變化,所以就先自動按日期創建.log文件,不斷生成內容然後提交

while (!stoppingToken.IsCancellationRequested)
{
    var fileName = $"{DateTime.Now.ToString("dd")}.log";
    var content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

    // 寫入內容
    WriteText(path, fileName, content);

    using (var repo = new Repository(path))
    {
        // Stage the file
        Commands.Stage(repo, "*");
        // Create the committer's signature and commit
        var author = new Signature(name, email, DateTime.Now);
        var committer = author;
        // Commit to the repository
        var commit = repo.Commit(content, author, committer);
        // git push
        var options = new PushOptions
        {
            CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) =>
            {
                return new UsernamePasswordCredentials()
                {
                    Username = username,
                    Password = password
                };
            })
        };
        repo.Network.Push(repo.Branches["master"], options);
    }

    Console.WriteLine(content);

    // 等待60秒繼續執行...
    await Task.Delay(60000, stoppingToken);
}

private static void WriteText(string path, string fileName, string content)
{
    path = Path.Combine(path, DateTime.Now.ToString(@"yyyy\\MM"));
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    var filePath = Path.Combine(path, fileName);
    using var fs = new FileStream(filePath, FileMode.Append);
    using var sw = new StreamWriter(fs);
    sw.WriteLine(content);
}

至此,整個代碼編寫部分結束,項目發佈後可以選擇sc.exe註冊為Windows服務,在這裡推薦使用nssm(一個服務封裝程式),好了,趕緊蓋大樓去吧~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前操作了一個IDC網站,不到1個月的時間把網站的權重從0做到了1,本來想寫篇文章分享相關的操作經驗。後來因為網站整體規劃的原因,IDC網站需要關閉一段時間做備案的更新,排名肯定就會掉了,然後怕大家看到我後面網站的數據不是我分享說的樣子,說我騙人,就沒寫那次的分享經驗。 今天無意間通過站長工具查詢新 ...
  • 一、排序演算法 1、冒泡排序(Bubble Sort) 定義:是一種簡單的排序演算法。它重覆地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍曆數列的工作是重覆地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂 ...
  • 本人.net 程式猿一枚,平常最大的愛好就是coding ,尤其是對c#情有獨衷,數年前,因為某個同事的一句話“大公司都有自己的代碼框架,甚至是代碼工具”,因為當時在一個小公司就職,而我也只是一個小小的團隊帶頭人,心裡就莫名有了一個想法,做一款代碼工具,一款很有自我特色,從公司項目開發,到項目維護的 ...
  • 看到一篇公眾號文章《2020年什麼編程語言最受歡迎,待遇最高?》,其中對C#的描述如下:點擊閱讀原文,看到這是一篇翻譯文章:https://codinginfinite.com/top-programming-languages-2020-stats-surveys/這篇文章里列出的那些語言之中,明... ...
  • 本系列將和大家分享下ASP.NET Core Web 應用程式的一些基礎知識,本章主要分享ASP.NET Core 非同步編程之async await的應用。 ...
  • Entity Framework 6.0 入門系列 第一篇 好幾年前接觸過一些ef感覺不是很好用,廢棄。但是 Entity Framework 6.0是經過幾個版本優化過的產物,性能和功能不斷完善,開始學習。 EF ,全稱Entity FramWork。就是微軟以ADO.NET為基礎發展的所謂ORM ...
  • Excel讀取和寫入的完整代碼using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using NPOI.XSSF.UserModel;using System;using System.IO; namespace ConsoleTest{ class ...
  • 場景: 由一次大的項目改動引起的app端api不相容問題,這時候就需要對api做版本控制了,權衡之後因為用戶不多,選擇了強更,沒人想在已經寫了8000行代碼的單個svc文件中維護好幾個版本的介面或者繼續新建svc(wcf配置較繁瑣),但暴露出的版本控制問題還是要解決的,不能每次都強更呀。 api版本 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...