Можно ли определить, является ли удаленный интерфейс 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.