我正在与LibGit2Sharp一起为应用程序添加许多Git操作。我添加了Microsoft.Alm.Authentication以帮助进行身份验证和凭据管理器访问。它对于检索已从命令行输入的凭据非常有用。

但是,也可以通过任何方法来挂接到凭据管理器的登录UI,该UI提示输入Github,BitBucket和VSTS的用户名和密码。该用户界面会从命令行自动弹出,但在使用LibGit2Sharp时不会触发。

我已经查看了Github上的GitCredentialManager项目,并且可以看到提供UI的组件,但是在试图弄清楚如何将其显式连接之前,是否有某种方式我想不到了它是作为Microsoft.Alm.Authentication(或相关软件包)?还是有人可以指出一个示例或指南,以更好地说明这一点?

最佳答案

不幸的是,libgit2(或LibGit2Sharp)中没有功能可直接与git-credential-helper功能对话,而git本身就是用来执行此操作的。

相反,您可以在CredentialsHandler(或PushOptions)上设置一个FetchOptions,例如:

options.CredentialsProvider = (url, usernameFromUrl, types) => {
    string username, password;

    Uri uri = new Uri(url);
    string hostname = uri.Host;

    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.UseShellExecute = false;

    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;

    startInfo.FileName = "git.exe";
    startInfo.Arguments = "credential fill";

    Process process = new Process();
    process.StartInfo = startInfo;
    process.Start();

    process.StandardInput.WriteLine("hostname={0}", hostname);
    process.StandardInput.WriteLine("username={0}", usernameFromUrl);

    while ((line = process.StandardOutput.ReadLine()) != null)
    {
        string[] details = line.Split('=', 2);
        if (details[0] == "username")
        {
            username = details[1];
        }
        else if (details[0] == "password")
        {
            password = details[1];
        }
    }

    return new UsernamePasswordCredentials(username, password);
};

10-08 02:16