Search code examples
libgit2libgit2sharp

LibGit2Sharp: Fetching fails with "Too many redirects or authentication replays"


Here's the code I'm using to fetch:

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);
    }
}

but it fails during fetch with the following exception:

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)

I have verified that the config file has the required remote name and that git fetch works from the command line. I found that the exception originates from libgit2\src\transport\winhttp.c but I couldn't come up with a workaround/solution.


Solution

  • I tried @Carlos' suggestion in the following way:

    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);
        }
    }
    

    I could fetch from public repos on github as well as from password protected private repos on bitbucket; however, I couldn't do the same for the repositories hosted over LAN at work. Turns out they were configured in a way which does not accept UsernamePasswordCredentials provided by libgit2sharp. The following modification allowed me to fetch from repositories over LAN:

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

    (I'm trying to find out what is the exact difference between the two; if I get further insight into it, I'll update the answer.)