Использование GIT_SSH_COMMAND с GitPython

Я использую GitPython для инициализации нового локального репозитория, создания начальной фиксации и отправки в канонический репозиторий. К сожалению, последний шаг терпит неудачу, и мне трудно понять, почему. Я уверен, что просто неправильно использую переменную GIT_SSH_COMMAND, но я не уверен, как это сделать. Там не так много примеров, чтобы продолжить.

Я прочитал этот вопрос SO и углубился в соответствующий ошибка и commit, но мне явно не удалось правильно его собрать.

Помощь?

"Доказательство" Git v2.3+

$ git --version                                                                                                                          
git version 2.3.1

Фрагмент сценария

# Please take my word that I've init'd the repo and that any variables
# have been defined and initialized.
git_ssh_identity_file = os.path.expanduser('~/.ssh/id_rsa')
git_ssh_cmd = 'ssh -i %s' % git_ssh_identity_file
with git_project.git.custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
    git_project.remotes.origin.push(git_project.heads.master)

Результирующая ошибка

Traceback (most recent call last):
  File "./ct-new-project.py", line 204, in <module>
    git_project.remotes.origin.push(git_project.heads.master)
  File "/Library/Python/2.7/site-packages/git/remote.py", line 667, in push
    return self._get_push_info(proc, progress or RemoteProgress())
  File "/Library/Python/2.7/site-packages/git/remote.py", line 588, in _get_push_info
    handle_process_output(proc, stdout_handler, progress_handler, finalize_process)
  File "/Library/Python/2.7/site-packages/git/cmd.py", line 202, in handle_process_output
    return finalizer(process)
  File "/Library/Python/2.7/site-packages/git/util.py", line 158, in finalize_process
    proc.wait()
  File "/Library/Python/2.7/site-packages/git/cmd.py", line 300, in wait
    raise GitCommandError(self.args, status, self.proc.stderr.read())
git.exc.GitCommandError: 'git push --porcelain origin master' returned with exit code 128

person Rob Wilkerson    schedule 02.03.2015    source источник
comment
уж больно очевидный вопрос, так что я уверен, что вы его проверили... но мало ли. Это работает из командной строки? то есть GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa' git push --porcelain origin master? На всякий случай, если с вашим репо что-то не так. Или GIT_SSH_COMMAND что-то конкретное для GitPython?   -  person kdopen    schedule 02.03.2015
comment
Я должен был сказать «что-то не так с вашим статусом репо» (поскольку при нажатии происходит сбой по какой-то причине, не связанной с переопределением SSH). И да, я только что проверил, и GIT_SSH_COMMAND является переменной git, а не GitPython, так что вы сможете проверить это из командной строки.   -  person kdopen    schedule 02.03.2015
comment
Знаешь что? Да и нет. Я пытался, но, должно быть, это было в более ранней итерации, где у меня было что-то еще неправильное. Тем временем мое происхождение в .git/config не синхронизировалось с кодом, который я пытался отправить, и это было реальной проблемой на данный момент — я пытался отправить репозиторий, которого на самом деле не существовало. /карательный удар головой   -  person Rob Wilkerson    schedule 02.03.2015
comment
Каким бы мучительно очевидным ни был ваш вопрос, мой мозговой спазм также делает его ответом, так что вы можете добавить его как таковой и получить несколько баллов. :-) Спасибо, что одолжил мне тот дополнительный набор глазных яблок, который мне явно был нужен.   -  person Rob Wilkerson    schedule 02.03.2015
comment
Готово :) Когда-то в прошлом я делал чистилище на службе поддержки. Вы понятия не имеете, как часто вопрос о том, подключен ли он, вызывал ошеломленное молчание от звонящего... за которым следовали ругательства :)   -  person kdopen    schedule 02.03.2015


Ответы (1)


Когда GitPython выдает ошибку такого рода, всегда стоит проверить, что реальная команда, которую он пытается выполнить, работает из командной строки. Что-то могло измениться в вашем локальном клоне, что препятствует успешному выполнению команды.

Эквивалент того, чего вы пытаетесь достичь с помощью GitPython, можно сделать следующим образом:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa' git push --porcelain origin master

По крайней мере на ЛИНУКС. В Windows вам, вероятно, потребуется установить переменную среды непосредственно в отдельной команде.

При таких экспериментах я считаю полезным иметь «локальный» апстрим, который я могу отправить куда-нибудь на свой жесткий диск, чтобы я мог его выбросить и перезапустить — или git push --force из второго (нетронутого) клона апстрима.. потому что вы просто знаете, что хотя бы раз все испортите.

person kdopen    schedule 02.03.2015