Почему 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 (включая командную строку для помощника) здесь.