Использование C#: импорт репозитория Azure DevOps

Я пытаюсь импортировать репозиторий Azure Devops в новый репозиторий в том же проекте. Следующий код просто возвращает «Неверный запрос» и никакой другой информации.

public async Task ImportGenericRepository(GitRepository destinationRepository, GitRepository genericRepository, Guid serviceEndpointId)
{
    var importRequest = new GitImportRequest
    {
        Repository = destinationRepository,
        Parameters = new GitImportRequestParameters
        {
            GitSource = new GitImportGitSource
            {
                Url = genericRepository.RemoteUrl,
                Overwrite = false
            },
            DeleteServiceEndpointAfterImportIsDone = true,
            TfvcSource = null,
            ServiceEndpointId = serviceEndpointId
        },
    };
           
    try
    {
        await _connection.GitHttpClient.CreateImportRequestAsync(importRequest, _projectId, destinationRepository.Id);
    }
    catch (Exception ex)
    {
        throw;
    }

}

Я попытался сделать это напрямую с помощью HttpClient, получил ту же ошибку.

Вам действительно нужно использовать C# для этой операции? Другие варианты см. в разделе Импортировать репозиторий Git.

Rui Jarimba 02.08.2024 15:08

@RuiJarimba Мы автоматизируем определенные задачи. поэтому мне нужно использовать С#

Andy S 02.08.2024 15:11

Понятно. В любом случае, я бы посоветовал взглянуть на статью, которую я опубликовал выше, поскольку в ней упоминаются необходимые разрешения и другие детали (например, использовать пустой репозиторий), которые могут помочь вам решить вашу проблему.

Rui Jarimba 02.08.2024 15:45

Я бы порекомендовал написать сценарий Shell типа domek, чтобы автоматизировать это.

Michał Turczyn 02.08.2024 15:47

Небольшое замечание по C#: этот блок try/catch бесполезен и его следует удалить. Без него поведение вашего приложения будет точно таким же.

Daniel Mann 03.08.2024 05:48

@KevinLu-MSFT Я отметил правильный ответ. Моя проблема заключалась в том, что я неправильно создавал подключение к службе.

Andy S 07.08.2024 12:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
92
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я попробовал ваш код и вот что я заметил:

Ниже добавлены две строки для работы тестового кода (игнорируйте это):

var credentials = new VssBasicCredential(string.Empty, "test-pat");
VssConnection _connection = new VssConnection(new Uri(@"https://dev.azure.com/my-org"), credentials);

пришлось обновить эту строку:

await _connection.GetClient<GitHttpClient>().CreateImportRequestAsync(importRequest, _projectId, destinationRepository.Id);

Когда я предоставляю ServiceEndpointId в GitImportRequest, на портале Azure Devops отображается следующая ошибка:

И это работает нормально, когда я вообще удаляю использование ServiceEndpointId:

Возможно, вы могли бы попробовать без этой строки ServiceEndpointId = serviceEndpointId, а еще лучше — обновить публикацию и рассказать, как вы вызываете этот метод и какие значения предоставляете?

Ответ принят как подходящий

На основе вашего текущего образца С# я могу воспроизвести ту же проблему. Он покажет ошибку «Неверный запрос».

Причина проблемы может заключаться в том, что вам необходимо использовать другое подключение к службе типа Git.

Вот шаги:

Шаг 1. Создайте другое подключение к службе Git в настройках проекта -> Подключения к службам.

Шаг 2. Вы можете установить URL-адрес исходного репозитория и токен личного доступа (PAT) в подключении службы.

Например:

Шаг 3. Используйте подключение к другой службе Git в коде C#.

Вот мой пример:

using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;

namespace ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
 
            var _connection = new VssConnection(new Uri("https://dev.azure.com/OrgUrl"), new VssBasicCredential(string.Empty, "PAT"));

            string serviceEndpointstring = "6543a4ca-a195-476f-b9f4-7ce6a913773a";
            Guid serviceEndpointId = Guid.Parse(serviceEndpointstring);
            var repoidstring = "21c693ee-c612-4644-9191-d23acee19fab";
            Guid Repoguid = Guid.Parse(repoidstring);
            GitRepository destinationRepository = new GitRepository() { Id= Repoguid, Name  = "RepoName" };
            GitRepository genericRepository = new GitRepository() { RemoteUrl = "https://dev.azure.com/org/project/_git/sourcerepo" };
            var importRequest = new GitImportRequest
            {
                Repository = destinationRepository,
                Parameters = new GitImportRequestParameters
                {
                    GitSource = new GitImportGitSource
                    {
                        Url = genericRepository.RemoteUrl,
                        Overwrite = false
                    },
                    DeleteServiceEndpointAfterImportIsDone = true,
                    TfvcSource = null,
                    ServiceEndpointId = serviceEndpointId

                },
            };

            try
            {
                await _connection.GetClient<GitHttpClient>().CreateImportRequestAsync(importRequest, "projectid", destinationRepository.Id);
            }
            catch (Exception ex)
            {
                throw;
            }


        }
    }
}

Примечание. Вам необходимо изменить эту строку:

От:

 await _connection.GitHttpClient.CreateImportRequestAsync(importRequest, _projectId, destinationRepository.Id);

К:

 await _connection.GetClient<GitHttpClient>().CreateImportRequestAsync(importRequest, "projectid", destinationRepository.Id);

Вот еще один мой ответ по аналогичной проблеме: Импортировать репо с помощью Rest API

Другие вопросы по теме