2016-12-24 39 views
1

Octokitを使用してGitHubリポジトリ内のファイルを作成、更新、削除できるWindowsフォームアプリケーションを開発しようとしています。Octokitを使用してGitHubリポジトリ内のファイルを更新する

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)); 

    } 

まず、完全に機能するファイルを作成しました(コメントアウトされたコードを確認してください)。 「UpdateFileRequest」のための要件は、どのように

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

あるので、次にあなたが見ることができるように私は

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

、使用してそのファイルを更新しようとした、このような状況で、私は、SHA値を取得する必要がありますGitHubから私のファイルのSha値を受け取ることはできますか?

私はthisチュートリアルを次のですが、私は(createChangeSetをコメントアウトせずに)「createChangeSet.Content.Sha」をしようとすると、それは「コンテンツ」の下に赤い線を描画し、言う、

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 

私はGitHub Documentationを見て

ファイルやディレクトリの内容をリポジトリに戻すには、このようにしてsha値を取得できると仮定します。

ファイルを更新するためにその値を使用できるように、リポジトリ内のファイルのsha値を受け取るためにこのメソッドを実装するにはどうすればよいですか?

答えて

2

私は同じ問題を抱えていました。あなたは既存のファイルを最初に取得する必要があります。また、このファイルを使用すると、ファイルを更新するために最後のコミットシャーが得られます。

完全なデモコード:

  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)); 
      } 

私はそれを行うには良い方法があるかどうかわからない - 検索されたファイルは、例外がスローされ見つからない場合。

しかし、それはそのように動作するようです。

+0

このソリューションは完全に機能します。どうもありがとうございました! – coder

+0

しかし、同じようにGitHubからファイルの内容を取得するにはどうすればよいですか? – coder

+0

コンテンツはそこにあるはずです--GitHub Apiのドキュメントをご覧ください:https://developer.github.com/v3/repos/contents/#get-contents –

関連する問題