【问题标题】:LibGit2Sharp: Fetching fails with "Too many redirects or authentication replays"LibGit2Sharp:获取失败并显示“重定向或身份验证重放次数过多”
【发布时间】:2014-11-26 12:13:45
【问题描述】:

这是我用来获取的代码:

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,但我想不出解决方法/解决方案。

【问题讨论】:

  • 我在对 Azure DevOps 托管的 git 存储库进行身份验证时收到此错误,并且我不小心使用了我的常规凭据而不是个人访问令牌。我知道这不是 OP 的问题,但我想留个便条,以防它对 Google 同事有帮助(很可能是我自己,大约 6 个月后)。

标签: libgit2 libgit2sharp


【解决方案1】:

我通过以下方式尝试了@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 上的公共存储库以及 bitbucket 上受密码保护的私有存储库中获取;但是,我不能对工作中通过 LAN 托管的存储库做同样的事情。事实证明,它们的配置方式不接受 libgit2sharp 提供的UsernamePasswordCredentials。以下修改允许我通过 LAN 从存储库中获取:

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

(我正在尝试找出两者之间的确切区别;如果我进一步了解它,我会更新答案。)

【讨论】:

  • 不同之处在于使用给定的用户名和密码进行身份验证,DefaultCredentials 使用您的登录凭据进行身份验证。 UsernamePasswordCredentials 应该适用于 Basic 和 NTLM。 DefaultCredentials 应该适用于 NTLM 和 Kerberos。
  • CredentialsHandler credHandler = (_url, _user, _cred) => creds; credHandler 变量应命名为 ch 以使代码正常工作,但感谢您的回答!!!
【解决方案2】:

应该使Credentials 选项起作用的垫片目前有问题(无论如何已被弃用),请传递CredentialsProvider 作为回调。

【讨论】:

  • @RovinBhandari 你用的是什么版本?您是否也可以在其他存储库中重现此行为?你从哪里取货?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2016-04-03
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2021-11-23
  • 2011-06-23
相关资源
最近更新 更多