避免为每个子模块重新输入密码

M.M*_*M.M 9 git git-submodules

我有一个包含3个子模块的仓库.repo和子模块都在同一台服务器上,我有ssh访问权限.远程URL是:

ssh://mm@theserver.com/path/to/sub1.git
ssh://mm@theserver.com/path/to/sub2.git
ssh://mm@theserver.com/path/to/sub3.git
Run Code Online (Sandbox Code Playgroud)

如果我进行操作,git submodule update --remote那么它会提示我输入密码3次.

有没有办法更新子模块,但只需要一次密码?提交更改等同样如此.

小智 9

解决方案需要更少的头痛

另一种方法是使用内置的git缓存(v.7.7.10或更新版本),因此git会在你第一次提供它之后记住你的登录名和密码.

要使用默认超时(15分钟)启用git缓存,请键入

git config --global credential.helper cache
Run Code Online (Sandbox Code Playgroud)

要更改默认超时类型

git config --global credential.helper 'cache --timeout=3600'
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,在尝试这些命令中的任何一个之后,它仍然会在每次尝试从远程更新时提示我“输入密钥的密码”。使用 git 2.8.3。您链接到的页面表明 git 缓存仅对 https 连接有用,而我通过 ssh 连接(密码短语用于我的本地私钥)。您链接上的 SSH 链接确实说“您可以保护您的 SSH 密钥并配置一个身份验证代理,这样您就不必每次使用 SSH 密钥时都重新输入密码。”,但它没有详细说明如何要做到这一点。 (2认同)

M.M*_*M.M 7

信用:这个答案从 rjv 的答案开始,尽管我需要更多的步骤才能让它正常工作。其他源材料链接如下。

背景:我在 Windows 中使用 Cygwin,有一个git从源代码构建的版本。我没有使用 Cygwin git,尽管这应该同样适用。我正在使用 Cygwin 的ssh. 但是以下方法也适用于类 Unix 系统。


介绍

首先:在 git 调用之间不可能“记住”密码。(这git submodule是一个脚本,git在这里为每个子模块调用一次)。

但是,可以使用ssh-agent记住RSA 密钥密码。所以这里的步骤列表是:

  1. 为 ssh 链接创建一个 RSA 密钥对。
  2. .ssh/configgit主机设置一个条目
  3. 设置ssh-agent记住密码——或者只是在当前命令的持续时间内;或在当前 shell 的持续时间内。

创建 RSA 密钥对

如果您已经有一个密钥~/.ssh/id_rsa或其他想要使用的密钥,请跳过此步骤

  • 创建一个密钥对ssh-keygen使用强密码。对于这个答案,我们假设文件是mm_rsamm_rsa.pub。默认文件名是id_rsa等,但是在这个答案中,我将使用不同的名称,以便我们可以了解如何指定名称。如果您希望为不同的主机使用不同的密钥,这可能很有用。

  • 在服务器上:

    • 复制mm_rsa.pub~/.ssh
    • 附加mm_rsa.pub~/.ssh/authorized_keys(如果它不存在则创建它)
  • 在客户端:

    • 复制mm_rsa~/.sshandchmod 600 mm_rsa以便其他人无法读取您的私钥。

此时,您可以通过使用常用ssh命令打开 SSH 连接以及选项-i ~/.ssh/mm_rsa.


设置一个 ~/.ssh/config 条目

~/.ssh/config文件中(如果它不存在则创建它),创建一个这样的条目:

Host the_git_host
    HostName bla.bla.com
    User mm
    Port 2222
    IdentityFile ~/.ssh/mm_rsa
Run Code Online (Sandbox Code Playgroud)

完成这些步骤后,您应该能够通过 ssh 连接,只需发出命令ssh the_git_host,然后它会提示您输入密码。链接到更多详细信息

此外,您现在可以更改要使用的 git remote the_git_host,然后它将从.ssh/config文件中提取这些详细信息!

$ git remote -v
origin  ssh://mm@bla.bla.com:2222/path/to/repo (fetch)
origin  ssh://mm@bla.bla.com:2222/path/to/repo (push)

$ git remote set-url origin ssh://the_git_host/path/to/repo
Run Code Online (Sandbox Code Playgroud)

此时,您将能够执行此操作git remote update,它将使用mm_rsa证书,并提示您输入密码。


设置 ssh-agent

ssh-agent是一个守护进程。要启动它,您运行ssh-agent -s,但这有点棘手。它想设置环境变量,以便其他程序可以与它通信。然而,它不是仅仅设置它们,而是在命令行上输出它们。所以要实际运行ssh-agent你必须写:

eval $(ssh-agent)
Run Code Online (Sandbox Code Playgroud)

它既启动 ssh-agent 又设置环境变量。

要稍后杀死它并清除环境,请使用ssh-agent -k.

代理运行后,您可以通过以下命令记住密码:

ssh-add ~/.ssh/mm_rsa
Run Code Online (Sandbox Code Playgroud)

这将提示输入密码。如果您收到错误“无法打开与您的身份验证代理的连接”,请参阅此处

最后,每次都必须输入有点烦人,所以你可以将这个 gem插入你的.bashrc,这将延迟身份验证,直到你发出git命令:

ssh-auth() {
    # Start the SSH agent only if not running
    [[ -z $(ps | grep ssh-agent) ]] && echo $(ssh-agent) > /tmp/ssh-agent-data.sh

    # Load the environment variables for ssh-agent
    source /tmp/ssh-agent-data.sh > /dev/null

    # Authenticate
    [[ -z $(ssh-add -l | grep "mm_rsa") ]] && ssh-add ~/.ssh/mm_rsa
}
Run Code Online (Sandbox Code Playgroud)

这将为当前 shell 的其余部分(或直到您ssh-agent -k)保持身份验证。

所以,终于,我们可以去:

$ ssh-auth
$ git submodule update --remote
Run Code Online (Sandbox Code Playgroud)


rjv*_*rjv 2

一种解决方案可能是将您的计算机添加ssh public keyauthourized_keys服务器的文件中。之后,系统将不会要求您输入密码。

仅当您具有服务器访问权限时才可以实现此操作。

这就是你要做的

  • 复制您的公钥,通常位于~/.ssh/id_rsa.pub
  • 将密钥附加到~/.ssh/authorized_keys服务器中的文件中。

之后就可以不用密码连接服务器了