4

当我cd some-repo; git push origin master在我的 bash 终端中执行此操作时,它不会要求我输入用户名/密码,因为我猜 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 终端中似乎总是有效(不询问我任何用户名密码或其他标准输入),但有时会在 git-credential-osxkeychain 上挂起(可能会在标准输入上要求某些内容),但有时在我运行时不会它来自我的 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)。

4

1 回答 1

2

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

这里有更多关于gitcredential 基础设施的信息,还有更多关于 API(包括帮助程序的命令行)的信息

于 2013-04-17T08:01:09.990 回答