1

会话部分用私钥连接,没问题。但是,当我执行 git Clone 时,它​​会给出错误“身份验证失败”。如何包装、绑定或使连接的会话与 git clone 一起工作。我在 .NET 4.0 下使用 NGIT,但不要认为这很重要,因为 JGIT 几乎相同。

有任何想法吗 ?

谢谢加文

        JSch jsch = new JSch();
        Session session = jsch.GetSession(gUser, gHost, 22);
        jsch.AddIdentity(PrivateKeyFile); // If I leave this line out, the session fails to Auth. therefore it works.
        Hashtable table = new Hashtable();
        table["StrictHostKeyChecking"] = "no"; // this works
        session.SetConfig(table);
        session.Connect(); // the session connects.



        URIish u = new URIish();
        u.SetPort(22);
        u.SetHost(gHost);
        u.SetUser(gUser);            
        NGit.Transport.JschSession jschSession = new JschSession(session,u );

        if (session.IsConnected())
        {
            try
            {
                CloneCommand clone = Git.CloneRepository()
                    .SetURI(gitAddress)
                    .SetDirectory(folderToSave);                                        
                clone.Call();                  

             //   MessageBox.Show(Status, gitAddress, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                // AUth Fail..... ????

            }
        }
        else
        {
            session.Disconnect();

        }
        session.Disconnect();
4

1 回答 1

1

这里的问题是会话对象在任何时候实际上都没有与 CloneCommand 关联。因此,您为设置会话所做的所有工作实际上并没有做任何事情,因为 CloneCommand 将自己创建自己的会话(使用默认会话项)。

克隆命令将从SSHSessionFactory. 首先,您需要创建一个实现SSHSessionFactory抽象类的类,如下所示:

public class MySSHSessionFactory : SshSessionFactory
{
    private readonly JSch j;

    public MySSHSessionFactory()
    {
        this.j = new JSch();
    }

    public void Initialize()
    {
        this.j.SetKnownHosts(@"C:/known_hosts");
        this.j.AddIdentity(@"C:\id_rsa");
    }

    public override RemoteSession GetSession(URIish uri, CredentialsProvider credentialsProvider, NGit.Util.FS fs, int tms)
    {
        var session = this.j.GetSession(uri.GetUser(), uri.GetHost());
        session.SetUserInfo(new MyUserInfo());
        session.Connect();

        return new JschSession(session, uri);
    }
}

然后你可以设置所有新的 Git 命令在他们想要使用会话时使用这个工厂:

var sessionFactory = new MySSHSessionFactory();
sessionFactory.Initialize();
SshSessionFactory.SetInstance(sessionFactory);

// Now you can do a clone command.

请注意,我仍在弄清楚这个库,所以我可能没有以最佳方式编写 MySSHSessionFactory (例如,它是否处理关闭的会话的容错?)。但这至少是一个开始。

于 2013-11-30T08:52:16.843 回答