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

Git 避免为每个子模块重新输入密码,git,git-submodules,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次 有没有办法更新子模块,但只需要一

我有一个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次


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

一种解决方案可能是将您的机器
ssh公钥
添加到服务器的
authourized_密钥
文件中。之后,您将不会被要求输入密码

这只有在您具有服务器访问权限时才可能实现

你就是这样做的

  • 复制公钥,通常出现在
    ~/.ssh/id\u rsa.pub
  • 将密钥附加到服务器中的
    ~/.ssh/authorized_keys
    文件

之后,您就可以不用密码连接到服务器了。

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

Background:我正在Windows中使用Cygwin,其版本是从源代码构建的
git
。我没有使用Cygwin git,尽管这应该也适用。我正在使用Cygwin的
ssh
。但以下方法也适用于类unix系统


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

但是,可以通过使用来记忆。因此,这里的步骤列表如下:

  • 为ssh链接创建RSA密钥对
  • git
    主机设置
    .ssh/config
    条目
  • 设置
    ssh-agent
    以记住密码短语——或者仅在当前命令期间;或在当前外壳的持续时间内

  • 创建RSA密钥对 如果您在
    ~/.ssh/id\u rsa
    中已经有密钥或希望使用的其他密钥,请跳过此步骤

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

    • 在服务器上:

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

      • mm_rsa
        复制到
        ~/.ssh
        chmod 600 mm_rsa
        以便其他人无法读取您的私钥
    此时,您可以通过使用常用的
    SSH
    命令以及选项
    -i~/.SSH/mm\u rsa
    打开SSH连接来测试


    设置~/.ssh/config条目 在文件中(如果不存在则创建),创建如下条目:

    Host the_git_host
        HostName bla.bla.com
        User mm
        Port 2222
        IdentityFile ~/.ssh/mm_rsa
    
    完成这些步骤后,您应该能够通过ssh进行连接,只需发出命令
    ssh\u git\u host
    ,之后它将提示输入您的密码短语

    此外,您现在可以将git remote更改为使用
    git\u主机
    ,然后它将从
    .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远程更新
    ,它将使用
    mm_rsa
    证书,并提示输入您的密码短语


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

    eval $(ssh-agent)
    
    它启动ssh代理并设置环境变量

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

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

    ssh-add ~/.ssh/mm_rsa
    
    这将提示输入密码短语。如果出现错误“无法打开到您的身份验证代理的连接”

    最后,每次都必须键入,这有点烦人,因此您可以在
    .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
    }
    
    这将在当前shell的其余部分保持身份验证(或者直到您
    ssh-agent-k

    所以,我们终于可以走了:

    $ ssh-auth
    $ git submodule update --remote
    
    需要更少头痛的解决方案 另一种方法是使用内置的(需要v.1.7.10或更高版本),这样git会在您第一次提供登录名和密码后记住您的登录名和密码

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

    更改默认超时类型的步骤

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

    这里所有的答案都没有提到的是,提示输入用户名和密码很可能是由于更新需要验证的子模块引起的,例如私有存储库。我在这里发现了这个简洁的小细节:

    引述

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


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

    如果您有服务器访问权限,可以将您的机器密钥添加到serveruse的授权密钥文件中;该页面中的示例使用的是
    https
    ,但我觉得
    ssh://ma
    
    git config --global credential.helper 'cache --timeout=3600'