LibGit2Sharp: сбой при получении из-за слишком большого количества перенаправлений или повторов аутентификации

Вот код, который я использую для получения:

public static void GitFetch()
{
    var creds = new UsernamePasswordCredentials()
                {Username = "user",
                 Password = "pass"};
    var fetchOpts = new FetchOptions {Credentials = creds};
    using (repo = new Repository(@"C:\project");)
    {
        repo.Network.Fetch(repo.Network.Remotes["origin"], fetchOpts);
    }
}

но во время выборки происходит сбой со следующим исключением:

LibGit2Sharp.LibGit2SharpException: Too many redirects or authentication replays
Result StackTrace:  
at LibGit2Sharp.Core.Ensure.HandleError(Int32 result)
   at LibGit2Sharp.Core.Proxy.git_remote_fetch(RemoteSafeHandle remote, Signature signature, String logMessage)
   at LibGit2Sharp.Network.DoFetch(RemoteSafeHandle remoteHandle, FetchOptions options, Signature signature, String logMessage)
   at LibGit2Sharp.Network.Fetch(Remote remote, FetchOptions options, Signature signature, String logMessage)

Я проверил, что файл конфигурации имеет требуемое удаленное имя и что git fetch работает из командной строки. Я обнаружил, что исключение исходит из libgit2\src\transport\winhttp.c, но не смог не придумать обходной путь/решение.


person Rovin Bhandari    schedule 01.10.2014    source источник
comment
Я получаю эту ошибку при аутентификации в репозитории git, размещенном на Azure DevOps, и я случайно использую свои обычные учетные данные, а не токен личного доступа. Я знаю, что это не проблема ОП, но я хотел оставить заметку на случай, если это поможет коллеге из Google (скорее всего, мне самому через ~ 6 месяцев).   -  person Lee Richardson    schedule 29.04.2019


Ответы (2)


Я попробовал предложение @Carlos следующим образом:

public static void GitFetch()
{
    var creds = new UsernamePasswordCredentials()
                {Username = "user",
                 Password = "pass"};
    CredentialsHandler credHandler = (_url, _user, _cred) => creds;
    var fetchOpts = new FetchOptions { CredentialsProvider = credHandler };
    using (repo = new Repository(@"C:\project");)
    {
        repo.Network.Fetch(repo.Network.Remotes["origin"], fetchOpts);
    }
}

Я мог получать из общедоступных репозиториев на github, а также из защищенных паролем частных репозиториев на битбакете; однако я не мог сделать то же самое для репозиториев, размещенных в локальной сети на работе. Оказывается, они были настроены таким образом, что не принимают UsernamePasswordCredentials, предоставляемые libgit2sharp. Следующая модификация позволила мне получать данные из репозиториев по локальной сети:

    CredentialsHandler credHandler = (_url, _user, _cred) => new DefaultCredentials();

(Я пытаюсь выяснить, в чем точная разница между ними; если я получу более глубокое понимание этого, я обновлю ответ.)

person Rovin Bhandari    schedule 03.10.2014
comment
Разница в том, что один аутентифицируется с заданным именем пользователя и паролем, DefaultCredentials аутентифицируется с вашими учетными данными. UsernamePasswordCredentials должен работать с Basic и NTLM. DefaultCredentials должны работать с NTLM и Kerberos. - person Edward Thomson; 03.10.2014
comment
CredentialsHandler credHandler = (_url, _user, _cred) => creds; Переменная credHandler должна называться ch, чтобы код работал, но спасибо за ответ!!! - person Aleksei Poliakov; 23.10.2014

Прокладка, которая должна заставить работать опцию Credentials, в настоящее время содержит ошибки (и в любом случае устарела), вместо этого передайте CredentialsProvider в качестве обратного вызова.

person Carlos Martín Nieto    schedule 01.10.2014
comment
@RovinBhandari Какую версию вы используете? Можете ли вы воспроизвести это поведение и с другими репозиториями? Откуда вы берете? - person nulltoken; 01.10.2014