.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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...