为什么有时Git冻结git-credential-osxkeychain?

时间:2013-04-01 23:05:39

标签: macos git bash keychain

当我在我的bash终端中cd some-repo; git push origin master时,它没有问我用户名/密码,因为我猜git已经保存了(很久以前我不记得有关如何那个下来了。我正在推动GitHub回购作为远程起源。

所以我有一个C ++程序,它执行fork和

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

然后等待子bash过程完成。

有时它的效果很好,但有时候(看似随机)它会冻结。查看正在运行的进程层次结构,我看到:

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上挂起(可能在stdin上请求某些内容)有时但不是其他时候从我的C ++程序运行它?

我试过在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)-release(x86_64-apple-darwin12)。

1 个答案:

答案 0 :(得分:2)

如果没有太多信息,我的猜测是悬挂取决于您的登录钥匙串当时是否被锁定。在Mac上,如果登录钥匙串已解锁,则获取用户名和密码的查询可以不受阻碍地进行。但如果钥匙串被锁定,则Mac OS X会提示您输入登录密码以解锁钥匙串。我怀疑对话框在那里,只是隐藏在某些东西后面,所以你可能错过了它。它会等你输入你的密码,有效地挂起了这个过程。

有关gitcredential infrastructure here的更多信息,以及有关API的更多信息(包括帮助程序的命令行)here