Как настроить конфигурацию jschconfigsessionfactory для jgit, чтобы работали pull и push?

Я пытаюсь выполнить git pull/push, используя API jgit со следующим кодом.

org.eclipse.jgit.api.Git.open(theRepoFile).pull().call()

но я получаю исключения

JSchException Auth fail
com.jcraft.jsch.Session.connect (Session.java:461)
org.eclipse.jgit.transport.JschConfigSessionFactory.getSession (JschConfigSessionFactory.java:116)
org.eclipse.jgit.transport.SshTransport.getSession (SshTransport.java:121)
org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init> (TransportGitSsh.java:306)
org.eclipse.jgit.transport.TransportGitSsh.openPush (TransportGitSsh.java:152)
org.eclipse.jgit.transport.PushProcess.execute (PushProcess.java:130)
org.eclipse.jgit.transport.Transport.push (Transport.java:1127)
org.eclipse.jgit.api.PushCommand.call (PushCommand.java:153)

Несмотря на то, что использование cgit pull и push работает.

Я попытался проверить SO, например, код

Git-клиент Java с использованием jgit

но приведенный выше вопрос не дает полного закодированного примера того, что необходимо для выполнения git pull с удаленным репо, которое обычно аутентифицируется с помощью ключей ssh. Должен быть способ получить учетную информацию от ~/.ssh/ или эквивалента Windows.


person bmillare    schedule 19.09.2012    source источник


Ответы (3)


Jsch автоматически обнаружит ваши ключи SSH, но потерпит неудачу, если они защищены паролем. Вам нужно указать парольную фразу через CredentialsProvider следующим образом:

JschConfigSessionFactory sessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
    CredentialsProvider provider = new CredentialsProvider() {
        @Override
        public boolean isInteractive() {
            return false;
        }

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

        @Override
        public boolean get(URIish uri, CredentialItem... items) throws UnsupportedCredentialItem {
            for (CredentialItem item : items) {
                ((CredentialItem.StringType) item).setValue("yourpassphrase");
            }
            return true;
        }
    };
    UserInfo userInfo = new CredentialsProviderUserInfo(session, provider);
    session.setUserInfo(userInfo);
}
};
SshSessionFactory.setInstance(sessionFactory);
person Stephan Windmüller    schedule 08.03.2013
comment
Большое вам спасибо за это - я боролся с аутентификацией SSH для JGit, нашел это, и это сразу решило мою проблему. Большое спасибо. - person Jo Pinto Paul; 30.09.2015
comment
@JoPintoPaul: я пытался сделать это, используя аналогичный фрагмент. Не могли бы пожалуйста помочь. Мой вопрос: stackoverflow.com/questions/45889326/ - person mohanjot; 27.08.2017

Проблема в том, что Jsch не поддерживает ssh-agents из коробки. Нужно будет настроить https://github.com/ymnk/jsch-agent-proxy чтобы заставить его работать.

Альтернативой является создание собственных org.eclipse.jgit.transport.CredentialsProvider и установка org.eclipse.jgit.transport.CredentialItem правильных значений (запросив их у пользователя или просмотрев файл). Вы можете изменить значение по умолчанию CredentialsProvider с помощью org.eclipse.jgit.transport.CredentialsProvider/setDefault

Подробнее см. в моей библиотеке clojure dj: https://github.com/bmillare/dj/blob/library/src/dj/git.clj

person bmillare    schedule 21.09.2012
comment
так вы пробовали это, и это сработало? Не могли бы вы описать это более подробно, что именно там делать? интегрировать прокси в свой код? Это поможет следующему разработчику, столкнувшемуся с этой проблемой. - person Vince; 25.09.2012
comment
На самом деле я не использовал jsch-agent-proxy, я сделал свой собственный CredentialsProvider, который запрашивал у пользователя парольную фразу. Это на самом деле написано в clojure, но детали там. github.com/bmillare/dj/blob/library/src/ dj/git.clj - person bmillare; 25.09.2012

Я смутно помню, как получил ошибку с JSch, которая заблокировала меня на некоторое время, потому что журнал не был очень явным. Я не могу точно сказать, что это та же проблема, но я следил за этой страницей, чтобы решить свою проблему:

https://help.github.com/articles/generating-ssh-keys

(это было из-за неправильной конфигурации сети)

person Vince    schedule 19.09.2012
comment
Ссылка, которую вы разместили, не имеет ничего конкретного для jgit. Я сказал, что могу использовать обычный git, а значит, ключи ssh в порядке. Одна из возможностей заключается в том, что я использую инструменты цепочки ключей gentoo, которые могут быть чем-то, с чем jgit не знает, как справляться. - person bmillare; 20.09.2012
comment
если вы не хотите слушать, что говорят люди, не спрашивайте. потому что журнал был не очень явным, возможно, недостаточно ясным: я потерял дни работы, только глядя в том же направлении, что и вы, с Git, работающим отлично. Я не уверен, чего стоит мой ответ, потому что это смутное воспоминание, но если вы не попытаетесь, по крайней мере, вы уверены, что это не сработает лучше. И действительно, это не связано с jGit, но если вы найдете страницу с написанной конфигурацией jGit и ssh, не стесняйтесь публиковать ее, цель здесь состоит в том, чтобы следующий читатель нашел полезную информацию. - person Vince; 20.09.2012
comment
о, и в целом, вы узнаете это со временем, но Git гораздо более терпим к странным использованиям, чем jGit. - person Vince; 20.09.2012
comment
Пожалуйста, не принимайте это на свой счет. Я не нападаю на ваши усилия, но предлагаю разъяснения. (Обратите внимание на отсутствие отрицательного голоса.) Двигаясь вперед, ваши комментарии проясняют ситуацию. - person bmillare; 21.09.2012