Ответ 1
Я думаю, что если вы входите в систему с именем пользователя и паролем, вам нужно https. Для ssh вам понадобится открытый ключ, который соответствует записи на github.
Я пытаюсь клонировать репозиторий 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://[email protected]: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://[email protected]: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)....
Есть ли возможность набрать "да" на этот вопрос или просто пропустить его?
Спасибо!
Я думаю, что если вы входите в систему с именем пользователя и паролем, вам нужно https. Для ssh вам понадобится открытый ключ, который соответствует записи на github.
Я предполагаю, что вы захотите проверить помощь github:
http://help.github.com/win-set-up-git/
В частности, часть о генерации ключей ssh (ssh-keygen -t rsa -C "[email protected]"
). Прочтите статью для своей среды, и вы поймете, как получить лучшую конфигурацию.
Это будет делать (например, @michals, только меньше кода), если использовать имя пользователя/пароль с помощью ssh
public void gitClone() throws GitAPIException {
final File localPath = new File("./TestRepo");
Git.cloneRepository()
.setURI(REMOTE_URL)
.setDirectory(localPath)
.setCredentialsProvider(new UsernamePasswordCredentialsProvider("***", "***"))
.call();
}
У меня была та же проблема. Причиной была секретная фраза для секретного ключа 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();
Это работает для меня;)
Если хранилище является закрытым и требует аутентификации, вы (@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());
}
}
У меня была похожая проблема, хотя мои настройки немного отличались. Оставьте это здесь на случай, если кто-то еще столкнется с чем-то похожим. Я переопределил мой метод 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-репозиторию