subprocess.check_call: команда ‘[‘git’, ‘clone’]’ вернула ненулевой статус выхода 127

#python #git #ssh #subprocess #clone

#python #git #ssh #подпроцесс #клонировать

Вопрос:

Я работаю над микросервисом, для которого написал следующий скрипт для пользователя, который хочет ssh войти в удаленную среду и git clone репозиторий. Я указал GIT_SSH и GIT_PYTHON_GIT_EXECUTABLE для среды, а затем запустил git clone .

 def clone_if_local_repo_absent(local_repo_path, remote_repo_url):
    GIT_SSH = '...'
    GIT_PYTHON_GIT_EXECUTABLE = '/usr/bin/git'
    my_env = os.environ.copy()
    my_env["GIT_SSH"] = GIT_SSH
    my_env["GIT_PYTHON_GIT_EXECUTABLE"] = GIT_PYTHON_GIT_EXECUTABLE
    # Clones to directory specified
    exe_command = shlex.split('git clone {remote_repo_url} {repo_name}'.format(remote_repo_url=remote_repo_url, repo_name=local_repo_path))
    subprocess.check_call(exe_command, env=my_env, shell=True)
 

При запуске скрипта я получаю сообщение об ошибке: Command '['git', 'clone', remote_repo_url, 'LOCAL']' returned non-zero exit status 127.
Как я могу исправить эту ошибку?

Комментарии:

1. Почему бы вам не использовать что-то вроде gitpython ?

2. Почему str.format и shlex.split вместо просто check_call(['git', 'clone', remote_repo_url, local_repo_path], ...) ?

3. И об ошибке — это означает, что git потерпел неудачу. Вы пробовали git clone remote_repo_url LOCAL с консоли и видели, на что жалуется git?

4. Я не могу использовать gitpython, поскольку он не установлен в удаленной среде. Git также не установлен в удаленной среде. Итак, я пытаюсь передать GIT_SSH в git clone команду в subprocess call . Однако по- git clone прежнему не может быть выполнена, поскольку она показывает статус выхода 127

Ответ №1:

Как упоминалось в Git ProBook:

GIT_SSH , если указано, это программа, которая вызывается вместо ssh того, когда Git пытается подключиться к хосту SSH.
Он вызывается как $GIT_SSH [username@]host [-p <port>] <command> .

Обратите внимание, что это не самый простой способ настроить способ вызова ssh; он не будет поддерживать дополнительные параметры командной строки, поэтому вам придется написать сценарий-оболочку и указать на него GIT_SSH .
Вероятно, проще просто использовать ~/.ssh/config файл для этого.

ТАКИМ образом, это вообще не выполняется на удаленной стороне. Выполняется для подключения к удаленному серверу.

Если Git не установлен в удаленной среде, любой git clone выполняемый из сеанса ssh не будет работать.