Можно ли определить, является ли удаленный интерфейс http git умным или немым?
Я использую параметр в своем приложении для использования --depth 1
, чтобы сделать минимальный функциональный клон репо git, и я только что понял, что немой транспорт HTTP не поддерживает --depth
. Я хотел бы автоматически определить, является ли удаленный или удаленный http удаленным или умным, поэтому я могу опустить параметр --depth
при разговоре с немым http-репозиториями. Возможно ли это?
Альтернативно, есть ли прямой способ проверить, поддерживает ли git remote --depth
?
Ответы
Ответ 1
Один из способов - это прямые HTTP-запросы.
Смарт-поддерживающие git клиенты добавляют аргумент в конец первого захваченного URL, "[repo]/info/refs? service = git -upload-pack". Немой сервер просто отправит файл "info/refs" в качестве текста, игнорирующего аргумент, тогда как интеллектуальный сервер вернет некоторые двоичные данные перед списком refs, включая текст "service = git -upload-pack" и список функций (которые вы могли бы выяснить из глубины поддержки).
Вы можете script выполнить этот интеллектуальный/немой тест с помощью wget или curl, чтобы проверить тип MIME: text/plain (dumb) vs. application/x- git -upload-pack-advert (smart).
$ curl -si http://github.com/git/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type'
Content-Type: application/x-git-upload-pack-advertisement
$ curl -si http://git.kernel.org/pub/scm/git/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type'
Content-Type: application/x-git-upload-pack-advertisement
$ curl -si http://repo.or.cz/r/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type'
Content-Type: text/plain
(Pipe to grep -q "^Content-Type: application/x-git"
и используйте код возврата для теста true/false).
Ответ 2
Я считаю, что с git 1.8.2 вы можете проверить заголовок Content-Type
.
Вот почему commit git/git/4656bf47 упоминает:
Перед анализом подозрительного ответа smart-HTTP подтвердите, что возвращаемый Content-Type
соответствует стандарту. Это защищает клиента от попыток обработать полезную нагрузку, которая пахнет как ответ смарт-HTTP-сервера.
Вы можете увидеть пример установки этого поля в commit sitaramc/gitolite/32d14d39:
my $service = ( $ENV{SSH_ORIGINAL_COMMAND} =~ /git-receive-pack/ ? 'git-receive-pack' : 'git-upload-pack' );
if ($service) {
print "Content-Type: application/x-$service-advertisement\r\n";
}
Итак, поле заголовка Content-Type
с x-git-receive-pack-advertisement
или x-git-upload-pack-advertisement
означает smart http.