NGIT/JGIT/Git# SSH Сессия с закрытым ключом для репозитория Clone GiT

Сеанс части соединения с закрытым ключом, без проблем. Однако, когда я делаю git Clone, он выдает ошибку "Auth Fail". Как мне обернуть, связать или заставить подключенный сеанс работать с git clone. Я использую NGIT под.NET 4.0, но не думаю, что это имеет значение, так как 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();

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 оптимальным образом (например, обрабатывает ли она отказоустойчивость для закрывающихся сессий?). Но это как минимум начало.

Другие вопросы по тегам