一个不需要任何外部脚本的更简单的替代方法是使用SSH别名。我知道原帖子的作者特别要求不要改变~/.ssh/config文件,但我怀疑这里有一个误解。
服务器上的本地用户与提交操作的执行者不同,可以是与"git push"执行者不同的人。
服务器上托管软件可以作为单个用户(通常是'git')运行。
提交操作执行者的身份只与提交的元数据相关,对服务器来说无关紧要,并且不需要在服务器上进行认证。
"git push"执行者的身份是相关的,并且基于ssh密钥在运行Git托管软件的系统上确定。
因此,在进行推送的系统上,即使在相同的本地帐户和远程服务器上,甚至在同一Git存储库中,也可以强制使用特定身份来使用ssh别名,按照下面所述的方法。
假设您在gitorious.org服务器上拥有您的常规帐户,我们称之为“developer”。您不希望自动使用您的“developer”帐户进行推送[1],因此您为同步创建另一个gitorious帐户,我们称之为“robot”。
仅用于自动化的是“robot”帐户:
第 1 步: 将“robot”添加到需要推送到的gitorious项目中。
第 2 步: 在本地机器上创建一个无密码的密钥(这将与gitorious上的robot帐户相关联)。
ssh-keygen -f ~/.ssh/id_rsa_robot
步骤三:将公钥~/.ssh/id_rsa_robot.pub上传到'robot'账户在gitorious上。
步骤四:gitorious上的git SSH URIs格式为git@gitorious.org:prj_or_user/subproject.git。在您的~/.ssh/config文件中添加以下行:
host robot.gitorious.org
HostName gitorious.org
IdentityFile ~/.ssh/id_rsa_robot
IdentitiesOnly "yes"
这将确保:
- 每当使用“robot.gitorious.org”主机名时,它将连接到gitorious.org(HostName选项),
- 它将使用无密码密钥作为机器人在gitorius.org上进行身份验证(IdentiFile选项),并且
- 即使您有一个ssh代理正在运行,它也会忽略默认密钥并使用无密码密钥(IdentiesOnly“yes”)。
第5步:假设您的项目在gitorious上的SSH URI为“git@gitorious.org:project/project.git”,在本地存储库中使用稍微修改过的主机名定义一个新的远程“autopush”。
git remote add autopush git@robot.gitorious.org:project/project.git
安装已完成,现在尝试通过“autopush”远程推送到gitorious。
git push autopush master
如果一切顺利并且有更改需要推送,你应该会看到成功以“robot”身份推送到“gitorious.org”。
[1] 对于自动推送,必须为帐户生成无需密码的密钥,但将其附加到gitorious的“developer”帐户意味着自动作业可以将更改推送到任何涉及“developer”的gitorious项目。