Git 避免为每个子模块重新输入密码
我有一个3个子模块的回购协议。repo和子模块都在同一台服务器上,我可以通过ssh访问该服务器。远程URL是: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次 有没有办法更新子模块,但只需要一
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
)
但是,可以通过使用来记忆。因此,这里的步骤列表如下:
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'