Я пытаюсь написать валидацию для переданного Git URL, если он доступен, не пытаясь напрямую его клонировать.Я обнаружил, что использование git ls-remote
позволяет это сделать, но мне трудно переписать его на Python.Мне нужен неинтерактивный способ проверки этого (например, отсутствие запроса пароля и т. Д.), Поэтому я достиг этой команды, которая работает в оболочке:
$ git -c core.askpass='echo' ls-remote https://github.com/auhau/AuHau.githuasdfasdfb.io
Я использую GitPython, поэтому первым подходом былоиспользуйте их git.cmd.Git
оболочку, так как они не имеют для этого открытой функциональности.После некоторого сражения я достиг:
from git.cmd import Git
git = git()
git(c='core.askpass=\'echo\'').ls_remote('https://github.com/auhau/AuHau.githuasdfasdfb.io', shell=True)
что согласно выводу отладки правильно переводится в исходную команду оболочки, если я запускаю эту собранную команду в оболочке, я получаю ожидаемый результат.Но при вызове GitPython я получаю страницу помощи Git.
Итак, вторая попытка - использовать модуль subprocess
напрямую для непосредственного вызова git.
import subprocess
import shutil
url = 'https://github.com/auhau/AuHau.githuasdfasdfb.io'
git_bin = shutil.which('git')
r = subprocess.run([git_bin, '-c','core.askpass=\'echo\'','ls-remote', url], capture_output=True)
При этом у меня запрашивают имя пользователя / пароль, поэтому, очевидно, askpass
работает неправильно.Если я использую shell=True
для вызова подпроцесса, то он работает как положено, но я бы хотел этого избежать из-за соображений безопасности и производительности ...
Есть идеи?Пожалуйста?