Я пытаюсь импортировать репозиторий 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, получил ту же ошибку.
@RuiJarimba Мы автоматизируем определенные задачи. поэтому мне нужно использовать С#
Понятно. В любом случае, я бы посоветовал взглянуть на статью, которую я опубликовал выше, поскольку в ней упоминаются необходимые разрешения и другие детали (например, использовать пустой репозиторий), которые могут помочь вам решить вашу проблему.
Я бы порекомендовал написать сценарий Shell типа domek, чтобы автоматизировать это.
Небольшое замечание по C#: этот блок try/catch
бесполезен и его следует удалить. Без него поведение вашего приложения будет точно таким же.
@KevinLu-MSFT Я отметил правильный ответ. Моя проблема заключалась в том, что я неправильно создавал подключение к службе.
Я попробовал ваш код и вот что я заметил:
Ниже добавлены две строки для работы тестового кода (игнорируйте это):
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
Вам действительно нужно использовать C# для этой операции? Другие варианты см. в разделе Импортировать репозиторий Git.