我正在尝试对传递的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)
根据调试输出正确地转换为原始shell命令,如果我在shell中运行此汇编命令,则会得到预期的输出。但是通过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
用于子流程调用,则它可以按预期工作,但是出于安全和性能方面的原因,我还是希望避免这种情况……
有什么想法吗?好吗?