"Аутентификация не поддерживается": ошибка jgit при попытке клонировать tfs, размещенный в git repo

Когда я пытаюсь клонировать размещенное на tfs git repo http://tfstta.com:8080/tfs/DefaultCollection/_git/SampleTFSGit с моей машины linux, я сталкиваюсь с ошибкой аутентификации не поддерживается:

org.eclipse.jgit.api.errors.TransportException: http: //: @ tfstta.int.thomson.com: 8080 / tfs / DefaultCollection / _git / SampleTFSGit.git: аутентификация не поддерживается *

Включение базовой аутентификации / альтернативных учетных данных, кажется, не вариант.

Может кто-нибудь сказать мне, пожалуйста, обойти это? Я был бы очень признателен!

7 ответов

Перейти к меню Eclipse

Окно -> Настройки -> Команда -> Git -> время обновления правой боковой панели до 3000. `Тайм-аут соединения (секунды): 3000. Нажмите кнопку Применить и закрыть. Повторное клонирование решит вашу проблему.

Эта проблема возникает из-за того, что JGit не полностью поддерживает NTLM, и вместо того, чтобы вернуться к базовой аутентификации или чему-то еще, он тут же остановится.

Обычно TFS отвечает неудачной аутентификацией с несколькими заголовками WWW-Authenticate. Что здесь происходит, так это то, что в JGit есть ошибка org.eclipse.jgit.transport.http.apache.HttpClientConnection, это будет учитывать только последний из заголовков WWW-Authenticate, заставляя его сдаваться даже перед попыткой подключения других типов.

Я предлагаю использовать собственную реализацию org.eclipse.jgit.transport.http.HttpConnection, реализуя так:

@Override
public Map<String, List<String>> getHeaderFields() {
    Map<String, List<String>> ret = new HashMap<>();
    for (Header hdr : resp.getAllHeaders()) {
        List<String> list;
        if(ret.containsKey(hdr.getName())) list = ret.get(hdr.getName());
        else { list = new LinkedList<>(); ret.put(hdr.getName(), list); }
        for (HeaderElement hdrElem : hdr.getElements())
            list.add(hdrElem.toString());
    }
    return ret;
}

Или, если вы ленивый (как я), вы можете просто переключиться на org.eclipse.jgit.transport.http.JDKHttpConnection и будьте счастливы, потому что он использует родное соединение Java под ним, которое работает правильно.

Если вы пытаетесь использовать Spring Cloud Config Server с TFS Git Repository, мой выбор - просто реализовать свой собственный ConfigurableHttpConnectionFactory

/**
 * This will use native Java connections, instead of crappy ecplise implementation.
 * There will be no management of implementation though. I cannot assure
 */
public class SpringJDKConnectionFactory extends JDKHttpConnectionFactory implements ConfigurableHttpConnectionFactory {
    @Override
    public void addConfiguration(MultipleJGitEnvironmentProperties environmentProperties) {
    }
}

И загрузите конфигурацию по умолчанию Spring:

@Configuration
public class JGitConnectionFactoryConfiguration {
    @Bean
    @Primary
    public ConfigurableHttpConnectionFactory configurableHttpConnectionFactory() {
        return new SpringJDKConnectionFactory();
    }
}

Но будьте осторожны, TFS, вероятно, не понравится Basic auth с прямыми паролями. Поэтому создайте "Персональный токен доступа" в TFS и используйте его вместо пароля.

Простой пример кода:

public static void main(String[] args) throws GitAPIException, IOException {
    CloneCommand cmd;
    String url = "http://tfs-url.com/Git-Repo";
    File file = new File("build/git_test");
    if(file.exists())
        FileUtils.delete(file,FileUtils.RECURSIVE);
    cmd = new CloneCommand();
    cmd.setDirectory(file);
    cmd.setURI(url);
    //#use Personal access tokens as basic auth only accepts these
    cmd.setCredentialsProvider(new UsernamePasswordCredentialsProvider("UserAccount","personalaccesstoken"));
    ConfigurableHttpConnectionFactory cf = new SpringJDKConnectionFactory();
    HttpTransport.setConnectionFactory(cf);
    Git git = cmd.call();
}

Возможно, вы захотите попробовать https://www.visualstudio.com/en-us/products/team-explorer-everywhere-vs.aspx поскольку это кроссплатформенная командная строка TFS от Microsoft. Код публикуется на GitHub, если вы хотите попытаться исправить помощников по аутентификации обратно в jGit.

Я столкнулся с этой проблемой с новым компьютером (настроенным кем-то другим). Исправлена ​​ошибка с переустановкой JDK и запуском с ним Eclipse.

Я бы порекомендовал вам обновить сервер TFS до последнего обновления 3, а затем использовать SSH-аутентификацию для Git Repository.

Поддержка SSH для Git Repos

Обновление 3 TFS 2015 теперь позволяет подключаться к любому репозиторию Git Team Foundation Server с помощью ключа SSH. Это очень полезно, если вы разрабатываете на Linux или Mac. Просто загрузите свой личный ключ SSH, и вы готовы к работе.

Я использовал плохой подход, но для начальной работы меня это устраивает.

В моем случае я переключил видимость проекта на gitlab с privateк public. Перейти к Gitab-> <your project>-> Settings-> General-> Visibility, project features, permissions-> переключиться на PublicВ application.propertiesя добавил только spring.cloud.config.server.git.uriбез свойств аутентификации, а также в конце gitlab uri добавлено .git

      http://gitlab.com/<your-repo-name>.git

Я не рекомендую этот подход для людей, которые выполняют задачи для компании.

Когда вы используете команду ниже, вам будет предложено ввести имя пользователя и пароль.

git-clone http://:@tfstta.int.thomson.com:8080/tfs/DefaultCollection/_git/SampleTFSGit

В моем тесте, когда отправить команду, вам будет предложено Windows Security. Нет необходимости использовать обычную аутентификацию / альтернативные учетные данные, просто введите domaine\username и пароль подключится к TFS.

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