"Аутентификация не поддерживается": ошибка 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.