JGit клон репозитория - PullRequest
       51

JGit клон репозитория

7 голосов
/ 17 декабря 2011

Я пытаюсь клонировать Git-репозиторий с JGit, и у меня проблема с UnsupportedCredentialItem.

Мой код:

FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repository = builder.setGitDir(PATH).readEnvironment().findGitDir().build();

Git git = new Git(repository);              
CloneCommand clone = git.cloneRepository();
clone.setBare(false);
clone.setCloneAllBranches(true);
clone.setDirectory(PATH).setURI(url);
UsernamePasswordCredentialsProvider user = new UsernamePasswordCredentialsProvider(login, password);                
clone.setCredentialsProvider(user);
clone.call();   

Произойдет исключение:

 org.eclipse.jgit.errors.UnsupportedCredentialItem: ssh://git@github.com:22: Passphrase for C:\Users\Marek\.ssh\id_rsa at
 org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider.get(UsernamePasswordCredentialsProvider.java:110)....

Но если я удаляю файл known_hosts в .ssh \ Это будет происходить иначе Исключение

org.eclipse.jgit.errors.UnsupportedCredentialItem: ssh://git@github.com:22: The authenticity of host 'github.com' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting?
at org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider.get(UsernamePasswordCredentialsProvider.java:110)....

Есть ли возможность набрать "да" на этот вопрос или просто пропустить его?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 06 апреля 2012

Я думаю, что если вы войдете в систему с именем пользователя и паролем, вам нужен https. Для ssh вам понадобится открытый ключ, который совпадает с записанным ключом в github.

3 голосов
/ 13 января 2014

Это будет сделано (как @michals, только меньше кода), если вы используете имя пользователя / пароль с ssh

public void gitClone() throws GitAPIException {
    final File localPath = new File("./TestRepo");
    Git.cloneRepository()
        .setURI(REMOTE_URL)
        .setDirectory(localPath)
        .setCredentialsProvider(new UsernamePasswordCredentialsProvider("***", "***"))
        .call();
}
3 голосов
/ 20 декабря 2011

Полагаю, вы захотите проверить справку github:

http://help.github.com/win-set-up-git/

Особенно о генерации ключей ssh ​​(ssh-keygen -t rsa -C "your_email@youremail.com").Прочитайте статью для своей среды, и вы поймете, как получить лучшую конфигурацию.

2 голосов
/ 14 июня 2013

У меня была такая же проблема. Причиной была парольная фраза, установленная для закрытого ключа RSA. Когда я удаляю ключевую фразу для этого ключа, он начал работать без CredentialsProvider.

UsernamePasswordCredentialsProvider, вероятно, не поддерживают фразу-пароль. Если вы хотите установить пароль, вы можете определить свой собственный CredentialProvider, который будет его поддерживать, например:

CloneCommand clone = Git.cloneRepository()
    .setURI("...")
    .setCredentialsProvider(new CredentialsProvider() {

        @Override
        public boolean supports(CredentialItem... items) {
            return true;
        }

        @Override
        public boolean isInteractive() {
            return true;
        }

        @Override
        public boolean get(URIish uri, CredentialItem... items)
                throws UnsupportedCredentialItem {

            for (CredentialItem item : items) {
                    if (item instanceof CredentialItem.StringType) {
                        ((CredentialItem.StringType) item).
                            setValue(new String("YOUR_PASSPHRASE"));
                        continue;
                    }
                }
                return true;
            }
        });

clone.call();

у меня работает;)

0 голосов
/ 24 января 2019

У меня была похожая проблема, хотя мои настройки немного отличались. Оставьте это здесь на случай, если кто-то еще столкнется с чем-то похожим. Я переопределил мой метод configure и метод createDefaultJSch в соответствии с этим руководством: https://www.codeaffine.com/2014/12/09/jgit-authentication/

У меня было что-то вроде:

@Override
public void configure( Transport transport ) {
  SshTransport sshTransport = ( SshTransport )transport;
  sshTransport.setSshSessionFactory( sshSessionFactory );
}

@Override
protected JSch createDefaultJSch( FS fs ) throws JSchException {
  JSch defaultJSch = super.createDefaultJSch( fs );
  defaultJSch.addIdentity( "/path/to/private_key" );
  return defaultJSch;
}

Я закончил тем, что изменил свой метод createDefaultJSch на getSch (добавив соответствующие параметры) и добавил removeAllIdentity ():

@Override
public JSch getJSch(final OpenSshConfig.Host hc, FS fs) throws JSchException {
  JSch jSch = super.getJSch(hc, fs)
  jSch.removeAllIdentity()
  jSch.addIdentity( "/path/to/private_key" )
  return jSch
} 

Не знаю, почему это сработало, но я нашел вещь getSch из этого ответа (по совпадению того же парня, который написал учебник): Использование ключей с JGit для безопасного доступа к репозиторию Git

0 голосов
/ 20 мая 2018

Если хранилище является закрытым и требует аутентификации, вы (@Scruger) сделаете это, используя имя пользователя / пароль с ssh для хранилища клонов.

private UsernamePasswordCredentialsProvider configAuthentication(String user, String password) {
            return new UsernamePasswordCredentialsProvider(user, password ); 
        }

    public void clonneRepositoryWithAuthentication(String link, String directory,String branch,String user, String password){
         System.out.println("cloning repository private from bitcketebuk");
        try {
            Git.cloneRepository()//function responsible to clone repository
                                       .setURI(link)// set link to repository git
                                       .setDirectory(new File(Constants.PATH_DEFAULT + directory))//Defined the path local the cloning
                                       .setCredentialsProvider(configAuthentication(user, password))
                                       .setCloneAllBranches(true)//Defined clone all branch exists on repository
                                       .call();//execute call the clone repository git
            System.out.println("Cloning sucess.....");
        } catch (GitAPIException e) {
            System.err.println("Error Cloning repository " + link + " : "+ e.getMessage());
        }

    }
...