会话部分与私钥连接,没问题。但是,当我执行git Clone时,它会出现错误'Auth Fail'。如何使用git clone包装,绑定或使连接的会话工作。我在.NET 4.0下使用NGIT,但不认为这很重要,因为JGIT几乎是一样的。
有什么想法吗?
感谢Gavin
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();
答案 0 :(得分: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(它是否处理关闭的会话的容错,例如?)。但这至少是一个开始。