2016-12-24 3 views
1

Ich versuche, eine Windows Forms-Anwendung zu entwickeln, die Dateien in einem GitHub-Repository mit Octokit erstellen, aktualisieren und löschen kann.Aktualisieren einer Datei im GitHub-Repository mit Octokit

public Form1() 
    { 
     InitializeComponent(); 

     var ghClient = new GitHubClient(new ProductHeaderValue("Octokit-Test")); 
     ghClient.Credentials = new Credentials("-personal access token here-"); 

     // github variables 
     var owner = "username"; 
     var repo = "repository name"; 
     var branch = "master"; 

     // create file 
     //var createChangeSet = ghClient.Repository.Content.CreateFile(owner,repo,"path/file2.txt",new CreateFileRequest("File creation", "Hello World!", branch)); 

     // update file 
     var updateChangeSet = ghClient.Repository.Content.UpdateFile(owner, repo,"path/file2.txt", new UpdateFileRequest("File update","Hello Universe!", "SHA value should be here", branch)); 

    } 

Zum einen habe ich es geschafft, eine Datei zu erstellen (siehe Info auf Kommentar-Code), die voll funktionsfähig ist. Dann habe ich versucht, die Datei zu aktualisieren verwenden,

var updateChangeSet = ghClient.Repository.Content.UpdateFile(owner, repo,"path/file2.txt", new UpdateFileRequest("File update","Hello Universe!", "SHA value should be here", branch)); 

Wie Sie in dieser Situation sehen können, ich habe den sha Wert, da die Voraussetzung für den „UpdateFileRequest“ erhalten ist,

UpdateFileRequest(string message, string content, string sha, string branch) 

Wie kann ich diesen Sha-Wert für meine Datei von GitHub erhalten?

Ich verfolge this Tutorial, aber wenn ich versuche, „createChangeSet.Content.Sha“ (ohne createChangeSet kommentieren out), zieht eine rote Linie unter „Inhalt“ und sagt:

Task<RepositoryChangeSet> does not contain a definition for 'Content' and no extention method 'Content' accepting a first argument of type Task<RepositoryChangeSet> could be found 

Ich sah GitHub Documentation und es sagt, ich sollte,

GET /repos/:owner/:repo/contents/:path 

den Inhalt einer Datei oder eines Verzeichnisses in einem Repository zurückkehren, damit ich nehme an, ich in der Lage, die sha Wert auf diese Weise zu erhalten.

Wie kann ich diese Methode implementieren, um den sha-Wert für meine Datei im Repository zu erhalten, damit ich diesen Wert verwenden kann, um die Datei zu aktualisieren?

Antwort

2

Ich hatte das gleiche Problem und um die sha zu erhalten, müssen Sie die vorhandene Datei zuerst und mit dieser Datei erhalten Sie auch die letzte Festschreibung sha, die verwendet werden kann, um die Datei zu aktualisieren.

Full-Demo-Code:

  var ghClient = new GitHubClient(new ProductHeaderValue("Octokit-Test")); 
      ghClient.Credentials = new Credentials("//...//"); 

      // github variables 
      var owner = "owner"; 
      var repo = "repo"; 
      var branch = "branch"; 

      var targetFile = "_data/test.txt"; 

      try 
      { 
       // try to get the file (and with the file the last commit sha) 
       var existingFile = await ghClient.Repository.Content.GetAllContentsByRef(owner, repo, targetFile, branch); 

       // update the file 
       var updateChangeSet = await ghClient.Repository.Content.UpdateFile(owner, repo, targetFile, 
        new UpdateFileRequest("API File update", "Hello Universe! " + DateTime.UtcNow, existingFile.First().Sha, branch)); 
      } 
      catch (Octokit.NotFoundException) 
      { 
       // if file is not found, create it 
       var createChangeSet = await ghClient.Repository.Content.CreateFile(owner,repo, targetFile, new CreateFileRequest("API File creation", "Hello Universe! " + DateTime.UtcNow, branch)); 
      } 

Ich bin mir nicht sicher, ob es ein besserer Weg, es zu tun - wenn die gesuchte Datei nicht eine Ausnahme ausgelöst wird gefunden wird.

Aber es scheint so zu funktionieren.

+0

Diese Lösung funktioniert perfekt. Vielen Dank! – coder

+0

Wie kann ich jedoch den Inhalt der Datei von GitHub auf die gleiche Weise erhalten? – coder

+0

Der Inhalt sollte da sein - siehe die GitHub Api Dokumentation: https://developer.github.com/v3/repos/contents/#get-contents –

Verwandte Themen