Git Push without user interaction

调用 git push 命令时,会出现警告提示,如用户名/密码提示、ssh host authenticity 确认,需用户交互才能继续完成 git 后续动作。在某些应用场景中,用户希望自动化操作而不需要人工干预。

  • SSH 方式推送

    • url 格式

      [email protected]:<username>/<reponame>
    • 情况描述

      参考 Github help documents,完成设置后,在首次连接 github 时(执行 clonefetchpush 等命令),出现如下提示:
      The authenticity of host 'github.com (a.b.c.d)' can\'t be established.
      RSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
      Are you sure you wan\'t to continue connecting (yes/no)?
      确认后,将在 ~/.ssh 目录下建立 known_hosts 文件保存 github.com 的公钥信息。
    • 解决办法

      原理:ssh config 文件中 StrictHostKeyChecking 选项控制 ssh 的登录验证行为
    方法一:把 /etc/ssh/ssh_config 文件中 StrictHostKeyChecking 选项值设为 no (注:ssh config 文件位置在不同的用户环境下可能有所不同)
    方法二:设置 GIT_SSH 环境变量
    需事先建立 shell 脚本,然后设置该环境变量值为该 shell 脚本名称
    touch myssh
    vi myssh
    (内容如下)
    #!/bin/sh
    exec /usr/bin/ssh -o StrictHostKeyChecking=no "$@"
    (保存myssh后,执行如下操作)
    export GIT_SSH=myssh
    方法三:设置 GIT_SSH_COMMAND 环境变量
    export GIT_SSH_COMMAND="/usr/bin/ssh -o StrictHostKeyChecking=no"(linux)
    export GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no"(mingw)
  • https 方式推送

    • url 格式

      https://github.com/<username>/<reponame>
    • 情况描述

      执行 git push 时,提示输入 github 的用户名/密码
    • 解决办法

    git 通过 credential helper 保存用户凭证,git 目前提供两种 helper(用户也可使用第三方helper),分别是 credential-cache 和 credential-store。其中,credential-cache 只能把用户凭证保留在内存中,而 credential-store 则可以把用户凭证保存在文件中。 执行如下命令
    git config credential.helper store
    cat https://<username>:<password>@github.com >> ~/.git-credentials
    (执行 git push 后,生成 ~/.git-credentials 文件,格式为 https://<username>:<password>@github.com
  • 小结

git 默认提供的 credential-store helper 以明文形式保存用户凭证,与 ssh 相比,安全性较差,除非使用更安全的第三方 credential helper。建议使用 ssh 方式。