我有一个包含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次。
有没有办法更新子模块,但只需要一次密码?提交更改等同样如此。
答案 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。所以这里的步骤列表是:
.ssh/config
主机git
条目
ssh-agent
以记住密码 - 只是在当前命令的持续时间内;或者当前shell的持续时间。 如果您已经拥有~/.ssh/id_rsa
或其他想要使用的密钥,请跳过此步骤
使用ssh-keygen
创建密钥对。的 Use a strong passphrase 即可。对于这个答案,我们假设文件是mm_rsa
和mm_rsa.pub
。默认文件名是id_rsa
等,但在本回答中我将使用不同的名称,以便我们可以看到如何指定名称。如果您希望为不同的主机使用不同的密钥,这可能很有用。
在服务器上:
mm_rsa.pub
复制到~/.ssh
mm_rsa.pub
附加到~/.ssh/authorized_keys
(如果它不存在则创建它)在客户端:
mm_rsa
复制到~/.ssh
和chmod 600 mm_rsa
,以便其他人无法读取您的私钥。此时,您可以使用常用的ssh
命令以及-i ~/.ssh/mm_rsa
选项打开SSH连接来测试。
在~/.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 -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的简短版本)。