Почему git иногда зависает на git-credential-osxkeychain?

Когда я делаю cd some-repo; git push origin master в моем терминале bash он не запрашивает у меня имя пользователя / пароль, потому что я думаю, что git уже сохранил это (это было так давно, что я не помню подробности того, как это произошло). Я подталкиваю к репозиторию GitHub в качестве удаленного источника.

Так что у меня есть программа на C++, которая делает форк и

execl("/bin/bash", "/bin/bash", "-c", "cd some-repo; git push origin master", (char *)0);

Затем ожидает завершения процесса дочернего процесса.

Иногда это работает просто отлично, но иногда (на первый взгляд случайным образом) оно замерзает. Глядя на иерархию запущенных процессов, я вижу:

MyProgram
  git
    git-remote-http
      git
        git-credential-osxkeychain

Если я убью самый дочерний процесс git-credential-osx, моя программа возобновит работу (потому что завершается самая родительская команда git), что приведет к неожиданным выводам, таким как:

error: git-credential-osxkeychain died of signal 15
error: RPC failed; result=7, HTTP code = 0
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

Мой вопрос: почему git push origin master кажется, что всегда работает (без запроса какого-либо пароля или другого стандартного имени пользователя) в терминале bash, но иногда зависает (возможно, запрашивает что-то на stdin) на git-credential-osxkeychain, но не в других случаях, когда я запускаю его из своей программы C++?

Я попытался найти man-страницу на git-credential-osxkeychain и ничего не смог найти. Запуск только печатает Usage: git credential-osxkeychain <get|store|erase> что не самоочевидно для меня. Спасибо!

Я использую OS X 10.8.3; git версия 1.7.12.4 (Apple Git-37); GNU bash, версия 3.2.48(1)-релиз (x86_64-apple-darwin12).

1 ответ

Без большого количества информации, я предполагаю, что зависание зависит от того, заблокирована ли ваша цепочка для ключей входа в систему в то время. На Mac, если цепочка для ключей входа в систему разблокирована, тогда запрос на получение вашего имени пользователя и пароля может продолжаться беспрепятственно. Но если цепочка для ключей заблокирована, то Mac OS X попросит вас ввести пароль для входа, чтобы разблокировать цепочку для ключей. Я подозреваю, что там есть диалоговое окно, просто скрытое за чем-то, так что, возможно, вы его пропустили. Он будет ждать, пока вы введете свой пароль, фактически приостановив процесс.

Здесь больше информации об инфраструктуре gitcredential и больше об API (включая командную строку для помощника) здесь.

Другие вопросы по тегам