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

时间:2015-05-12 02:29:24

标签: 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

如果我执行git submodule update --remote等操作,则会提示我输入密码3次。

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

4 个答案:

答案 0 :(得分:8)

需要更少头痛的解决方案

另一种方法是使用内置git cache(v.1.7.10或更新版本),因此git会在您第一次提供后记住您的登录名和密码。

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

git config --global credential.helper cache

更改默认超时类型

git config --global credential.helper 'cache --timeout=3600'

答案 1 :(得分:3)

信用:这个答案始于rjv的回答,虽然我需要更多的步骤才能让它运行良好。其他来源材料链接如下。

后台:我在Windows中使用Cygwin,其源版本为git。我没有使用Cygwin git,尽管这应该是相同的。我正在使用Cygwin的ssh。但是以下方法也适用于类Unix系统。

简介

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

但是,可以使用RSA key passphrases来记住ssh-agent。所以这里的步骤列表是:

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

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

    • 使用ssh-keygen创建密钥对。的 Use a strong passphrase 即可。对于这个答案,我们假设文件是​​mm_rsamm_rsa.pub。默认文件名是id_rsa等,但在本回答中我将使用不同的名称,以便我们可以看到如何指定名称。如果您希望为不同的主机使用不同的密钥,这可能很有用。

    • 在服务器上:

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

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

    此时,您可以使用常用的ssh命令以及-i ~/.ssh/mm_rsa选项打开SSH连接来测试。

    设置〜/ .ssh / config条目

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

    Host the_git_host
        HostName bla.bla.com
        User mm
        Port 2222
        IdentityFile ~/.ssh/mm_rsa
    

    执行这些步骤后,您应该只需发出命令ssh the_git_host即可通过ssh进行连接,之后它会提示您输入密码。Link to more detail

    此外,您现在可以更改您的git遥控器以使用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
    

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

    设置ssh-agent

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

    eval $(ssh-agent)
    

    它们都启动ssh-agent并设置环境变量。

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

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

    ssh-add ~/.ssh/mm_rsa
    

    将提示密码短语。如果您收到错误“无法打开与身份验证代理的连接”,请see here

    最后,每次都要输入有点烦人,所以你可以在你的.bashrc中插入this gem,这将延迟身份验证,直到你发出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
    }
    

    这将持续对当前shell的其余部分进行身份验证(或直到ssh-agent -k)。

    所以,最后,我们可以去:

    $ ssh-auth
    $ git submodule update --remote
    

答案 2 :(得分:2)

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

只有在您拥有服务器访问权限时才可以这样做。

你就是这样做的

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

之后,您可以在没有密码的情况下连接到服务器

答案 3 :(得分:0)

这里所有答案都没有提及,是用户名和密码提示很可能是由更新需要身份验证的子模块(例如,私有存储库)引起的。我在这里找到了这个整洁的小细节:

https://www.appveyor.com/docs/how-to/private-git-sub-modules/

报价

当子模块引用私有Git存储库时,如果不进行身份验证就无法克隆该私有存储库,则会导致构建停滞,从而出现问题。这是因为子模块存储库不包含用于认证主存储库的SSH公钥,因此Git要求提供凭据:

这意味着您需要使用SSH克隆子模块。 GitHub提供了一个不错的setup guide,其中包含所有必要的步骤(基本上是@ M.M`s answer的简短版本)。