【问题标题】:How to commit a list of folders and files to Azure DevOps Repository using Rest API?如何使用 Rest API 将文件夹和文件列表提交到 Azure DevOps 存储库?
【发布时间】:2021-08-11 08:03:23
【问题描述】:

我正在尝试使用 Azure DevOps REST API 自动创建存储库及其初始化。我能够使用 API 成功创建存储库。

我们如何使用 REST API 提交构成基本代码结构的批量数据,例如文件夹和文件列表?在 Pushes - Create 的请求正文中,contentType 可以是 base64encoded 或 rawtext。我已经使用 rawtext 来测试单个文件的提交并且它成功地工作。现在,我必须同时提交文件和文件夹。

【问题讨论】:

  • @ShaykiAbramczyk - 是的,我已经提到了这个。在示例请求正文中,所有项目都是单独的文件,内容类型是 rawtext。里面没有提到文件夹。
  • 我不认为这是可能的:/你可以用git命令自动化它而不用api。

标签: azure azure-devops azure-devops-rest-api


【解决方案1】:

准确地说,Rest API 总是用于提交与项目相关的文档。

如果要提交文件夹中的所有文件,则应定义更改中所有文件的路径。 Shayki Abramczyk 的评论真的很有帮助。 注意: Git 文件夹不能为空。

例如,这两个路径将提交文件夹“内容”。

"item": {
     "path": "/tasks/content/newtasks.md"
}

"item": {
    "path": "/tasks/content/inactivetasks.md"
}

请参考这个类似的issue,Rakesh用C#创建了一个自动推送文件的功能。

public class Refs
    {
        public string name { get; set; }
        public string objectId { get; set; }

        public string oldObjectId { get; set; }

        public Creator creator { get; set; }
        public string url { get; set; }
    }
    
    public class Change
    {
        public string changeType { get; set; }
        public Item item { get; set; }
        public Newcontent newContent { get; set; }
    }

    public class CommitToAdd
    {
        public string comment { get; set; }
        public ChangeToAdd[] changes { get; set; }
    }

    public class ChangeToAdd
    {
        public string changeType { get; set; }
        public ItemBase item { get; set; }
        public Newcontent newContent { get; set; }
    }
     public class ItemBase
    {
          public string path { get; set; }
    }
    
     public class Newcontent
    {
        public string content { get; set; }
        public string contentType { get; set; }
    }
    
  //  ### Implementation 
    
//on your    Program.cs file

public static class program
{
    public async Task AddFileToRepository(string projectName, string repositoryId, Dictionary<string, Task<string>> blobContainer)
        {

            var refs = new List<Refs>() { new Refs { oldObjectId = "0000000000000000000000000000000000000000", name = Constants.DevOps.MASTER_REPO_REF_NAME } };

            var changes = new List<ChangeToAdd>();

            foreach (var blob in blobContainer)
            {
                if (!blob.Key.StartsWith(".git"))
                {
                    ChangeToAdd changeJson = new ChangeToAdd()
                    {
                        changeType = "add",
                        item = new ItemBase() { path = blob.Key },
                        newContent = new Newcontent()
                        {
                            contentType = "rawtext",
                            content = blob.Value.Result
                        }
                    };
                    changes.Add(changeJson);
                }
            }

            CommitToAdd commit = new CommitToAdd();
            commit.comment = "commit from code";
            commit.changes = changes.ToArray();

            var content = new List<CommitToAdd>() { commit };
            var request = new
            {
                refUpdates = refs,
                commits = content
            };

            var uri = $"https://dev.azure.com/{_orgnizationName}/{projectName}/_apis/git/repositories/{repositoryId}/pushes{Constants.DevOps.API_VERSION}";

            using (var client = this.HttpClient)
            {
                var authorizationToken = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", personalaccessToken)));

                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authorizationToken);

                var requestJson = JsonConvert.SerializeObject(request);
                var httpContent = new StringContent(requestJson, Encoding.ASCII, "application/json");
                var response = await client.PostAsync(uri, httpContent);

                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception(ApplicationMessages.FailedToAddFilesToRepository);
                }
            }
        }
}

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2021-05-22
    • 1970-01-01
    • 2020-05-07
    • 2011-06-15
    • 2020-12-08
    • 2021-08-12
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多