如何在 EC2 上推送到 git
Posted
技术标签:
【中文标题】如何在 EC2 上推送到 git【英文标题】:How to push to git on EC2 【发布时间】:2011-06-05 16:30:28 【问题描述】:我正在尝试遵循this 的指示。我有一个本地 git 存储库,当我执行 git push 时,我需要将存储库推送到我的 EC2 实例。
但是,在上面的教程中,当我执行git push origin master
时,我得到Permission denied (publickey)
错误,因为我没有指定身份文件。
说,我这样登录 EC2:ssh -i my_key.pem username@11.111.11.11
那么,我可以在这里做类似的事情吗:git -i my_key.pem push origin master
或在.git/config
中设置身份文件
那么,我该如何设置呢?
更新:git config -l
的输出
user.name=my name
user.email=my_email_addreess@gmail.com
github.user=userid
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=ec2_id@my_e2_ip_address:express_app
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
更新(来自@Jon 的comment):
如果您的密钥位于奇怪的路径中,只需运行 ssh-add /private/key/path
。这对我有用。
【问题讨论】:
ssh-add /private/key/path
工作!
当你说它有效时,你能添加说明你实际上一步一步做了什么吗?
@Designermonkey 已更新。
您在哪台机器上运行它,本地还是 EC2 实例?你的配置中的express_app
是什么?
@Designermonkey 位于 ec2 实例上。它是 git repo 的名称,它是一个节点的 express 框架应用程序。
【参考方案1】:
要将本地 ssh 密钥复制到亚马逊试试这个
cat ~/.ssh/id_?sa.pub | ssh -i amazon-generated-key.pem ec2-user@amazon-instance-public-dns "cat >> .ssh/authorized_keys"
当然是替换密钥和亚马逊 ec2 公共 dns 的名称。
然后你就可以在亚马逊上设置你的遥控器了
【讨论】:
我遵循了这个,但使用了 rsa 密钥而不是 dsa 密钥。另外,我在 cat 和 >> 之间添加了一个空格,例如:“cat >> .ssh/authorized_keys” 这并没有回答我们在执行 git push 命令时如何指定密钥的问题【参考方案2】:here 列出的说明对我更有用。
来自链接:
调整您的~/.ssh/config
并添加:
Host example
Hostname example.com
User myuser
IdentityFile ~/.ssh/other_id_rsa
现在使用 ssh 主机别名作为您的存储库:
$ git remote add origin example:repository.git
$ git pull origin master
它应该使用other_id_rsa
键!
【讨论】:
我还发现git remote add ec2 ssh://ubuntu@54.243.293.151:zivot
很有用。在此之前,我不知道有人可以在地址前加上ssh://
。
很好的答案,希望能利用我已经在使用的 ssh 配置。
太棒了。这比找出完整的 URL 要好。
10 年后仍然可以节省数小时的互联网挖掘时间。谢谢!【参考方案3】:
在您的本地机器上,编辑您的 ~/.ssh/config 并添加:
Host example
Hostname example.com
User myuser
IdentityFile ~/.ssh/YOURPRIVATEKEY
您应该能够使用“ssh 示例”登录到您的实例。请记住,您的私钥应该是 chmod 400。一旦您可以在不使用“ssh -i mykey.pem username@host”的情况下通过 ssh 登录,请执行以下操作。
在您的 EC2 实例上,初始化一个用于以独占方式推送的裸存储库。惯例是在文件夹名称中添加扩展名“.git”。这可能与通常在“项目”文件夹中具有 .git 文件夹的本地存储库不同。裸存储库(根据定义)没有附加工作树,因此您无法像在普通非裸存储库中那样轻松地将文件添加到它们。这只是他们完成的方式。在您的 ec2 实例上:
mkdir project_folder.git
cd project_folder.git
git init --bare
现在,回到您的本地计算机,在设置远程时使用 ssh 主机别名。
git remote add ec2 EXAMPLEHOSTFROMSSHCONFIG:/path/to/project_folder.git
现在,你应该可以做到了:
git push ec2 master
现在您的代码正在毫无问题地推送到服务器。但此时的问题是,您在 ec2 实例上的 www 文件夹不包含您的网络服务器需要执行的实际“工作文件”。因此,您需要设置一个“挂钩”脚本,该脚本将在您推送到 ec2 时执行。此脚本将使用您的实际项目文件填充 ec2 实例上的相应文件夹。
因此,在您的 ec2 实例上,进入您的 project_folder.git/hooks 目录。然后创建一个名为“post-receive”的文件并 chmod 775 它(它必须是可执行的)。然后插入这个 bash 脚本:
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "ec2" == "$branch" -o "master" == "$branch" ]; then
git --work-tree=/var/www/example.com/public_html/ checkout -f $branch
echo 'Changes pushed to Amazon EC2 PROD.'
fi
done
现在,在您的本地计算机上,执行“git push ec2 master”,它应该将代码推送到您的裸仓库,然后接收后挂钩脚本会将您的文件检出到您的网络服务器配置的适当文件夹中阅读。
【讨论】:
这对我有用。 chmods 非常重要。 @devdrc 您可能需要进一步编辑它并强调命令行语句。 bash 脚本之前的部分效果很好,但是 bash 脚本对我不起作用。这个答案***.com/a/24027870/847954 对我很有用。感谢 devdrc 发布这篇文章,感谢 @blamb 发布脚本。 @jeffmusk 你需要确保post-receive
文件是可执行的【参考方案4】:
您需要生成 SSH 密钥并将其上传到 EC2 实例。跟随本教程:http://alestic.com/2010/10/ec2-ssh-keys
【讨论】:
但是我已经有了用于登录 EC2 的键值对私钥。 试试这个线程中的一些解决方案:serverfault.com/questions/39733/… 我理解那部分,但这是一个 Git 配置问题。 我没有发现您的配置有任何问题,因此我认为您的 SSH 密钥有问题,无论是放错位置还是其他问题 - 很可能是您的配置,而不是您的配置。 如果您的密钥位于奇怪的路径中,只需运行ssh-add /private/key/path
。【参考方案5】:
我发现这是最快的方法:https://gist.github.com/matthewoden/b29353e266c554e04be8ea2058bcc2a0
基本上:
ssh-add /path/to/keypair.pem
(“-add”必须在 ssh 之后)
检查它是否有效:ssh ubuntu@crazylongAWSIP
(可能你的用户名不是 ubuntu)
之后,您可以在您的 ec2 上设置一个 git repo 并推送到它:
git remote add origin ec2Username@long-crazy-amazon-ip.com:/path/to/your/repo-name.git
git config --global remote.origin.receivepack "git receive-pack" # needed for aws ec2 stuff.
git push origin master
您的选择是在您的 ec2 上设置一个“裸”git repo(这意味着其他 git repos 可以从中提取并推送到它,但它不会保存任何文件),或者您可以设置一个 NORMAL repo 并直接推送到它(如果你想将本地更改推送到你的 ec2 而不必不断地 ssh 到你的 ec2,我的偏好)。
如果您想在 ec2 上设置 NORMAL 存储库,请通过 ssh 进入 ec2,在您想要的位置执行 git init
,然后执行以下操作:
git config receive.denyCurrentBranch updateInstead
有关“接收拒绝当前分支”的解释,请参阅:cannot push into git repository
【讨论】:
【参考方案6】:-
运行
ssh-keygen
本地
在您的 本地 ~/.ssh/
目录中,您现在应该会看到一个名为 id_rsa.pub
的 公钥 文件 - 将此文件的内容复制到 /etc/ssh/authorized_keys
文件中,它位于您的远程服务器上。
您可以复制并粘贴内容,也可以先将文件上传到远程服务器并使用以下命令:
cat id_rsa.pub >> /etc/ssh/authorized_keys
【讨论】:
第 2 步和第 3 步是否相同? 不,@JoeTidee - 第 2 步是将密钥放到远程服务器上,第 3 步是将其添加到正确的位置。 :)【参考方案7】:我想我不会在这里发布任何新内容,但我必须深入研究上述答案来解决我的特殊情况。我在 EC2 上有一个 Ubuntu 实例。
要登录我的实例,我需要这样做:
ssh -i "pemfile.pem" ubuntu@very-long-amazon-address
密钥文件“pemfile.pem”必须用引号引起来。
我添加了遥控器:
remote add origin ubuntu@very-long-amazon-address/home/ubuntu/git/REPO/gitfile.git
但是当我尝试推动时:
git push origin master
我明白了:
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
为了修复,我做了:
/<path to pemfile>/pemfile.pem
这给了我回应,
Identity added: /<path to pemfile>/pemfile.pem (/<path to pemfile>/pemfile.pem )
之后推送顺利进行。
【讨论】:
我不明白当你说“为了修复我做了:/path to pemfile/”我的 pemfile.pem 没有执行任何东西......你用什么命令来添加身份? 请说明并总结您使用哪个命令添加密钥???【参考方案8】:我在通过源代码管理部署时遇到permission denied,但不知道原因。我意识到我正在为其创建 ssh 密钥的用户(名为 ubuntu,也是我的 ec2 服务器的推荐登录名)不是负责 cap deploy 的用户(root)。为 root 运行 ssh-keygen 并将该 ssh 密钥作为部署密钥上传到 bitbucket 解决了我的问题。
【讨论】:
【参考方案9】:我知道我为时已晚,但我只是想分享这篇文章,我已经在几秒钟内成功推送到 EC2 git repo
http://shirtdev.wordpress.com/2011/05/04/setting-up-a-git-repository-on-an-amazon-ec2-instance/
【讨论】:
【参考方案10】:这是对我有用的最简单的方法... 我在克隆存储库时遇到问题...它无法识别我创建的 SSH 密钥...我没有更改您的配置文件和所有这些,而是简单地复制了它试图连接的 REAL ssh 密钥并将其添加到bitbucket...这里是命令:
sudo vi /root/.ssh/id_rsa.pub
使用 VI 打开 REAL RSA 密钥并将内容复制并粘贴到 bitbucket...完成!
【讨论】:
【参考方案11】:也许这不是一个受欢迎的回应,但我一直在努力解决同样的问题,最终决定将文件夹存储在 AWS S3 Bucket 上,这是最快的解决方案,因为我正在处理非常大的文件和 +3000 个档案。
只需安装 Aws cli,使用 aws configure
和 aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive
之后,您可以将其下载到您的计算机上并像往常一样使用 GitHub,或者将您的存储桶公开,以便您可以在任何地方获取档案。
【讨论】:
【参考方案12】:对于其他可能感兴趣的人,这个解决方案对我来说被证明是最干净和最简单的:
http://eric.sau.pe/accessing-a-git-repository-using-a-key-pair/
【讨论】:
以上是关于如何在 EC2 上推送到 git的主要内容,如果未能解决你的问题,请参考以下文章
QT5下的QPushButton错误,同时在macos上推送到全屏
应该如何使用 Amazon Web 服务及其弹性 beantalk 将机密文件推送到 EC2 Ruby on Rails 应用程序?