3

GitHubAPIを介してファイルを更新しようとしています。

すべての設定が完了し、最終的に実際のファイルが更新されます。これは良いことです。

ただし、リポジトリにこれら2つのファイルがあるとします。

  • FileToBeUpdated.txt
  • README.md

そして、プログラムを実行します

FileToBeUpdated.txtは必要に応じて更新されますが、README.mdは削除されます。

これは、ファイルを更新するための5つのステップを含むコードです。

private static void Main()
{
    string shaForLatestCommit = GetSHAForLatestCommit();

    string shaBaseTree = GetShaBaseTree(shaForLatestCommit);

    string shaNewTree = CreateTree(shaBaseTree);

    string shaNewCommit = CreateCommit(shaForLatestCommit, shaNewTree);

    SetHeadPointer(shaNewCommit);
}

private static void SetHeadPointer(string shaNewCommit)
{
    WebClient webClient = GetMeAFreshWebClient();

    string contents = "{" +
                      "\"sha\":" + "\"" + shaNewCommit + "\", " +
                      // "\"force\":" + "\"true\"" +
                      "}";

    // TODO validate ?
    string downloadString = webClient.UploadString(Constants.Start + Constants.PathToRepo + "refs/heads/master", "PATCH", contents);
}

private static string CreateCommit(string latestCommit, string shaNewTree)
{
    WebClient webClient = GetMeAFreshWebClient();

    string contents = "{" +
                      "\"parents\" :[ \"" + latestCommit + "\" ], " +
                      "\"tree\":" + "\"" + shaNewTree + "\", " +
                      "\"message\":" + "\"test\", " +
                      "\"author\": { \"name\": \""+ Constants.Username +"\", \"email\": \""+ Constants.Email+"\",\"date\": \"" + DateTime.UtcNow.ToString("s", CultureInfo.InvariantCulture) + "\"}" +
                      "}";


    string downloadString = webClient.UploadString(Constants.Start + Constants.PathToRepo + "commits", contents);

    var foo = JsonConvert.DeserializeObject<CommitRootObject>(downloadString);

    return foo.sha;
}

private static string CreateTree(string shaBaseTree)
{
    WebClient webClient = GetMeAFreshWebClient();



    string contents = "{" +
                      "\"tree\" :" +
                      "[ {" +
                      "\"base_tree\": " + "\"" + shaBaseTree + "\"" + "," +
                      "\"path\": " + "\"" + Constants.FileToChange + "\"" + " ," +
                      "\"content\":" + "\"" + DateTime.Now.ToLongTimeString() + "\"" +
                      "} ]" +
                      "}";


    string downloadString = webClient.UploadString(Constants.Start + Constants.PathToRepo + "trees", contents);

    var foo = JsonConvert.DeserializeObject<TreeRootObject>(downloadString);

    return foo.sha;
}

private static string GetShaBaseTree(string latestCommit)
{
    WebClient webClient = GetMeAFreshWebClient();

    string downloadString = webClient.DownloadString(Constants.Start + Constants.PathToRepo + "commits/" + latestCommit);

    var foo = JsonConvert.DeserializeObject<CommitRootObject>(downloadString);

    return foo.tree.sha;
}

private static string GetSHAForLatestCommit()
{
    WebClient webClient = GetMeAFreshWebClient();

    string downloadString = webClient.DownloadString(Constants.Start + Constants.PathToRepo + "refs/heads/master");

    var foo = JsonConvert.DeserializeObject<HeadRootObject>(downloadString);

    return foo.@object.sha;
}

private static WebClient GetMeAFreshWebClient()
{
    var webClient = new WebClient();

    webClient.Headers.Add(string.Format("Authorization: token {0}", Constants.OAuthToken));

    return webClient;
}

どの部分が欠けていますか?開始するのに間違ったツリーを使用していますか?

4

1 に答える 1

3

関数CreateTreeでは、作成する各ツリーのレベルではなく、ルートレベルでbase_treeを設定する必要があるようです。

したがって、関数CreateTreeでは、内容は次のようになります。

string contents = "{" +
                      "\"base_tree\": " + "\"" + shaBaseTree + "\"" + "," + // IT'S THIS LINE!
                      "\"tree\" :" +
                          "[ {" +
                              "\"path\": " + "\"" + Constants.FileToChange + "\"" + " ," +
                              "\"content\":" + "\"" + DateTime.Now.ToLongTimeString() + "\"" +
                      "} ]" +
                  "}";

更新されたGitHubドキュメント:https ://github.com/Snakiej/developer.github.com/commit/2c4f93003703f68c4c8a436df8cf18e615e293c7

于 2013-01-30T16:03:35.373 に答える