如何在EC2上推送到git


78

我正在尝试遵循说明。我有一个本地git存储库,当我执行git push时,我需要将该存储库推送到我的EC2实例。

但是,在上面的教程中,当我执行a时git push origin masterPermission 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的评论):

如果您的密钥位于一条奇怪的路径中,请运行ssh-add /private/key/path。这对我有用。


16
ssh-add /private/key/path工作了!
zengr 2011年

1
当您说它可行时,是否可以逐步说明您的实际操作?
designermonkey

@Designermonkey已更新。
zengr 2012年

您在本地或EC2实例上在哪台计算机上运行它?什么是express_app在你的配置?
designermonkey

@Designermonkey在ec2实例上。它是git repo的名称,它是节点的express框架应用程序。
zengr 2012年

Answers:


53

要将本地ssh密钥复制到亚马逊,请尝试以下操作

cat ~/.ssh/id_?sa.pub | ssh -i amazon-generated-key.pem ec2-user@amazon-instance-public-dns "cat >> .ssh/authorized_keys"

当然,请替换密钥和Amazon EC2公共DNS的名称。

然后,您将可以在亚马逊上设置遥控器


3
我按照此操作,但是使用了rsa密钥而不是dsa密钥。另外,我在cat和>>之间添加了一个空格,例如:“ cat >> .ssh / authorized_keys”
cmcculloh 2012年

4
这不能回答我们在执行git push命令时如何指定键的问题
psvj 2015年

27

这里列出的说明对我来说更有用。

从链接:

调整您的~/.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密钥!


2
从那到我,我也发现有用git remote add ec2 ssh://ubuntu@54.243.293.151:zivot。我不知道ssh://在那之前可以给地址加上前缀。
同构

很好的答案,是希望利用我已经在使用的ssh配置。
埃里克·威尔逊

太棒了 这比找出完整的URL更好。
2015年

20

在本地计算机上,编辑〜/ .ssh / config并添加:

Host example
Hostname example.com
User myuser
IdentityFile ~/.ssh/YOURPRIVATEKEY

您应该可以使用“ ssh example”登录到实例。记住您的私钥应该是chmod400。一旦可以不使用“ 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文件夹不包含Web服务器需要执行的实际“工作文件”。因此,您需要设置一个“钩”脚本,该脚本将在您推送到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”,它将代码推送到裸仓库,然后接收后挂钩脚本会将您的文件检出到配置为Web服务器读取的适当文件夹中。


1
这对我有用。chmod非常重要。@devdrc,您可能需要进一步编辑它,并使命令行语句更加突出。
亚伯·卡莱霍

bash脚本之前的部分效果很好,但是bash脚本对我没有用。这个答案stackoverflow.com/a/24027870/847954对我来说很棒。感谢devdrc的这篇文章和@blamb的脚本发布。
杰夫·穆斯克(Jeff Mussk),2017年

@jeffmusk,您需要确保该post-receive文件是可执行文件
Abel Callejo

5

您需要生成SSH密钥并将其上传到EC2实例。遵循本教程:http : //alestic.com/2010/10/ec2-ssh-keys


2
但是我已经有一个键-值对私钥,我曾经用它登录EC2。
zengr 2011年

在此线程中尝试一些解决方案:serverfault.com/questions/39733/…–
乔恩

2
我了解这部分,但这是一个Git配置问题。
zengr 2011年

我没有发现您的配置有任何问题,所以我认为您的SSH密钥有问题,可能是放错了位置还是没放错-最有可能的是那,而不是您的配置。
乔恩

6
如果您的密钥位于一条奇怪的路径中,请运行ssh-add /private/key/path
乔恩

4

我发现这是最快的方法: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

请参阅:无法推送到git存储库中 以获取“收到拒绝当前分支”的解释


2
  1. 本地运行ssh-keygen
  2. 现在,在本地 ~/.ssh/目录中,您应该看到一个名为-将此文件的内容复制到位于远程服务器上的文件的公共密钥文件。id_rsa.pub/etc/ssh/authorized_keys

您可以复制和粘贴内容,也可以先将文件上传到远程服务器,然后使用以下命令:

cat id_rsa.pub >> /etc/ssh/authorized_keys


1
步骤2和3是否相同?
JoeTidee

不,@ JoeTidee-步骤2将密钥添加到远程服务器上,而步骤3将密钥添加到正确的位置。:)
Alastair

1

我认为我没有在这里发布任何新内容,但是我不得不仔细研究以上答案以解决我的特殊情况。我在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 )

在那之后,一切顺利。


5
当您说“要解决我的问题:/ pemfile /的路径”时,我不明白我的pemfile.pem没有执行任何操作...。您使用什么命令添加身份?
rikkitikkitumbo

请指定并总结您的答案,即您用来添加密钥的命令????
Enginerd Sunio '19

0

通过源代码控制进行部署时,我的权限被拒绝,无法弄清原因。我意识到我要为其创建ssh密钥的用户(名为ubuntu,也是我的ec2服务器的建议登录名)不是负责cap部署(root)的用户。为root运行ssh-keygen并将该ssh密钥作为部署密钥上传到bitbucket解决了我的问题。



0

这是最适合我的最简便的方法...我在克隆存储库时遇到了麻烦...它无法识别我创建的SSH密钥...而不是更改配置文件和所有内容,我只是复制了REAL它试图连接的ssh密钥,我将其添加到bitbucket ...这是命令:

 sudo vi /root/.ssh/id_rsa.pub

使用VI打开REAL RSA密钥,然后将内容复制并粘贴到bitbucket中。完成!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.